在Java中,强烈建议所有可序列化类显式声明serialVersionUID,因为默认的serialVersionUID计算对类细节高度敏感,编译器实现不可靠。C#中的序列化有什么特别之处? 最佳答案 在.Net中序列化不像在Java中那样胡思乱想。默认情况下它支持新字段,只是默认它们,并且它只是忽略它不期望的任何数据。您仍然可以通过在您的类中实现ISerializable接口(interface)并将您自己的自定义VersionId添加到您的类中并在那里检查它来实现相同类型的版本控制。您可以阅读更多相关信息here
serialVersionUID字段未命名为SERIAL_VERSION_UID是否有任何可行的原因?根据java.io.Serializable的文档:AserializableclasscandeclareitsownserialVersionUIDexplicitlybydeclaringafieldnamed"serialVersionUID"thatmustbestatic,final,andoftypelong:ANY-ACCESS-MODIFIERstaticfinallongserialVersionUID=42L;同时引用JavaNamingConventions所有
我不知道在java中的什么地方使用默认serialVersionUID或生成的serialVersionUID?privatestaticfinallongserialVersionUID=4125965356358329466L;//generatedprivatestaticfinallongserialVersionUID=1L;//default 最佳答案 SerialVersionID用于序列化和反序列化对象。Java会识别要反序列化的字节是否与本地类版本匹配,否则将抛出异常。这在执行RMI或持久化对象结构时很重要。序列化
我正在尝试了解序列化如何与Java及其最新版本一起工作。我正在尝试像这样序列化一个lambda:Runnabler=(Runnable&Serializable)()->{System.out.println("Thisisatest");};但我注意到我没有关于缺少serialVersionUID变量的警告。正常吗?我知道它将在运行时生成,但强烈建议定义它:https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.htmlIfaserializableclassdoesnotexplicitlydeclareaser
在Java中,static和transient字段是不序列化的。但是,我发现静态字段的初始化导致生成的serialVersionUID被更改。例如,staticintMYINT=3;会导致serialVersionUID发生变化。在此示例中,这是有道理的,因为类的不同版本将获得不同的初始值。为什么任何初始化都会更改serialVersionUID?例如,staticStringMYSTRING=System.getProperty("foo");也会导致serialVersionUID发生变化。具体来说,我的问题是为什么使用方法进行初始化会导致serialVersionUID发生变化。
当我在Eclipse中创建实现Serializable接口(interface)的Java类时,我收到警告TheserializableclassABCDdoesnotdeclareastaticfinalserialVersionUIDfieldoftypelong所以当我点击警告时,我在Eclipse中得到一个选项来AddgeneratedSerialVersionID一旦我选择了该选项,Eclipse就会自动为我创建一个serialVersionUID变量。现在我想知道生成该数字的依据是什么。这是一个任意随机数?我可以提供我自己的任意随机数吗? 最佳答
众所周知,如果您未能显式定义它,运行时将为您的类生成serialVersionUID字段。但是有没有可能在runitme中得到这个值呢?是否有可能在运行时,引用.class,获取它的serialVersionUID? 最佳答案 Integeri=newInteger(5);longserialVersionID=ObjectStreamClass.lookup(i.getClass()).getSerialVersionUID();以上是在运行时获取类的序列版本号的示例代码。 关于jav
我想通过生成自动序列版本ID来删除某些类的一些警告。在Eclipse中,这很容易做到——IDE可以自动生成一个并将其添加到类中。但是,我在NetBeans中看不到此功能。是可用的么?如果是这样,它在哪里?如果没有,是否有可以启用它的插件? 最佳答案 实际上,我对这个“问题”的解决方案是在我的项目配置中停用该警告(我使用Eclipse,但我猜NetBeans是一样的)恕我直言错误警告:没有serialVersion是最安全的选择,因为JVM会在启动时计算一个唯一的版本(类似于类的哈希值),同时显式添加它会给你当且仅当您对代码进行了不兼
基于此处SerialVersionUID的描述:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100,似乎有必要始终在您创建的任何类中包含SerialVersionUID,以便用于序列化的JVM和用于反序列化的不同JVM不会自动分配它们自己的SerialVersionUID,由于虚拟机。这对于控制我自己的类的反序列化非常有效,但是如果我想确保标准库中使用JVMA序列化的类可以被JVMB反序列化怎么办?MapmyMap=newHashMap();HashMap定义了一个Seri
我在数据库中保存了一个java对象,然后几天后我更改了我的jre版本。现在,当我尝试读取同一个对象时,出现以下异常:Exceptioninthread"main"java.io.InvalidClassException:SerializeMe;localclassincompatible:streamclassdescserialVersionUID=-6377573678240024862,localclassserialVersionUID=-8204757486033751616我怎样才能摆脱这个,我怎样才能得到保存的对象?请帮助我。 最佳答案