Tag: serialversionuid

关于在Eclipse中生成的serialVersionUID

有没有办法在Eclipse中串行生成serialVersionUID? 通过串行我想要的意思是,如果一个可序列化的类具有serialVersionUID = 1L,那么当我生成另一个类的serialVersionUID时,这将是serialVersionUID = 2L。 如果我手动指定1L,2L,3L等,这会产生任何问题吗? Eclipse提供了一个选项“选择添加生成的串行版本ID”,这个选项可以选择安全吗?

eclipse中的serialVersionUID字段警告

我刚开始使用AWT并在其中创建了一个简单的程序,它工作正常,但它在eclipse中显示了一条我不明白的警告信息: 可序列化类TestGUI不声明long类型的静态最终serialVersionUID字段 我知道警告消息与AWT无关,并且没有必要发布我的整个代码,但是当我试图制作代码的SSCCE时,警告也消失了。 由于我不知道为什么会产生这个警告,所以我不知道在我的SSCCE中保留哪一部分。 因此整个代码! 我的代码是: import java.awt.Frame; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestGUI extends Frame { /** * @param args */ private int x = 50; private int y = 50; TestGUI(String s) { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { setVisible(false); System.exit(0); } }); addMouseListener(new […]

Java – 修改二进制序列化对象的serialVersionUID

几个月前,我将java.io.Serializable对象序列化为一个文件。 现在我需要读取内容,但从那时起serialVersionUID已经改变,现在我遇到了“类不兼容”的错误。 我知道没有数据成员发生过变化,因此唯一的障碍是serialVersionUID检查。 有没有办法禁用检查或修改二进制文件中的serialVersionUID? 澄清 这个问题假设我无法编辑源代码。 有没有办法可以破解.class文件或者破解序列化的目标文件(使用hex编辑器并在某个偏移量处更改值)?

序列化的lambda和没有serialVersionUID?

我正在尝试学习序列化如何与Java及其最新版本一起工作。 我正在尝试序列化这样的lambda: Runnable r = (Runnable & Serializable)() -> {System.out.println(“This is a test”);}; 但我注意到我没有关于缺少serialVersionUID变量的警告。 这是正常的吗? 我知道它将在运行时生成,但强烈建议您定义它: https : //docs.oracle.com/javase/8/docs/api/java/io/Serializable.html 如果可序列化类未显式声明serialVersionUID,则序列化运行时将基于类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassExceptions。 因此,为了保证跨不同java编译器实现的一致serialVersionUID值,可序列化类必须声明显式serialVersionUID值。 强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类 – serialVersionUID字段不适用于inheritance成员。 数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值。 我该怎么办 ? 如何在Lambda中定义它? 谢谢

我在哪里更改Eclipse中的设置,以便为Serializable类生成serialVersionUID?

我希望Eclipse为实现Serializable类生成serialVersionUID 。 但是,当我创建一个实现Serializable的类时,我的Eclipse实例不会向我发出警告或错误。 此外,它没有提供有关添加生成的serialVersionUID的建议。 我在哪里更改所需的设置?

每次更改时Eclipse自动生成serialVersionUID

Eclipse很好地为我生成了serialVersionUID。 但这似乎是被动代码生成,因为我更改文件时id不会自动更新,除非我再次生成代码。 有没有办法在每次更改内容时生成serialVersionUID? “保存行动”似乎没有包含这样的选项 – 有人找到了某种方法来做到这一点吗? 它可以与IDE保存操作或类似的东西结合使用,这样我可以恢复更改,如果我这样做不会影响序列化。 最好的问候,Touko 编辑:@gustafc:有两个要点: 如果我理解正确,不同的编译器最终可能会有不同的serialVersionUID值 从Serializable API : 但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,可能因编译器实现而异,因此在反序列化期间可能导致意外的InvalidClassExceptions 我正在使用类似命令模式的对象在服务器上做事情。 因此,即使对象内容没有改变,当客户端和服务器上的类内容不同时捕获这些情况也会很好。 但是在考虑另一个时间,这个不可能与自动生成的值一起使用,因为只有内容更改才会改变这一点? 所以,实际上我想要一个自动递增的serialVersionUID 这听起来合情合理吗? Summa summarum,经过多思考后,每次更改时自动递增的serialVersionUID会更好……

查找序列化对象的serialVersionUID

有没有办法确定生成的序列化Java对象的serialVersionUID ? 问题是我在没有明确指定serialVersionUID情况下序列化了一个对象。 现在反序列化过程抱怨类不兼容。 但是我并没有以一种使它不兼容的方式改变这个类。 所以我假设在类中指定serialVersionUID就足够了,因为它存储在对象数据中。 为此,我需要从序列化数据中读取serialVersionUID 。

无法连接到spark master:InvalidClassException:org.apache.spark.rpc.RpcEndpointRef; 本地类不兼容

我在Linux机器上安装了Spark。 版本是spark-1.6.2-bin-hadoop2.6.tgz。 然后我使用./sbin/start-all.sh启动Spark 我试图在Eclipse中运行JavaWordCount.java示例。 但总是失败。 有人可以帮助我吗? Spark Master的版本是:欢迎使用版本1.6.2,使用Scala版本2.10.5(Java HotSpot(TM)Server VM,Java 1.8.0_101),Eclipse上的Spark版本是: 例外情况如下: 16/07/25 12:01:20 INFO StandaloneAppClient$ClientEndpoint: Connecting to master spark:// hostname:7077… 16/07/25 12:01:20 WARN StandaloneAppClient$ClientEndpoint: Failed to connect to master hostname:7077 org.apache.spark.SparkException: Exception thrown in awaitResult at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:77) at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:75) at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59) at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59) at scala.PartialFunction$OrElse.apply(PartialFunction.scala:162) at org.apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:83) at org.apache.spark.rpc.RpcEnv.setupEndpointRefByURI(RpcEnv.scala:88) at org.apache.spark.rpc.RpcEnv.setupEndpointRef(RpcEnv.scala:96) at […]

为什么不自动生成serialVersionUID?

为什么不自动生成serialVersionUID ? 我在应用程序服务器上遇到了一个问题,显然是在缓存旧类。

现在,当对象具有不同的serialVersionUID时,如何反序列化数据库中持久存在的对象

我的客户端有一个oracle数据库,一个对象通过objOutStream.writeObject持久化为blob字段,该对象现在有一个不同的serialVersionUID (即使该对象没有变化,可能是不同的jvm版本),当他们尝试反序列化时抛出exception: java.io.InvalidClassException: CommissionResult; local class incompatible: stream classdesc serialVersionUID = 8452040881660460728, local class serialVersionUID = -5239021592691549158 他们从一开始就没有为serialVersionUID分配一个固定的值,所以现在有些东西改变了抛出exception。 现在他们不想丢失任何数据,为此我认为最好的方法是读取对象,对它们进行反序列化,然后通过XMLEncoder再次保存它们,以避免将来的错误,如当前的“类不兼容”错误。 显然,对于该对象持有的serialVersionUID有2个不同的值,所以我想读取数据,尝试使用一个值,如果失败则尝试使用其他值,为此我尝试更改类的serialVersionUID使用ASM api 。 我已经能够更改值,但问题是如何在类上激活更改,因此当它被反序列化时, objInpStr.readObject()将我的修改版本的类与我的特定serializedVersionUID 。 我做了一个测试类来模拟真实的环境,我拿一个对象(它具有不同serialVersionUID问题的对象属性)对象名称是Reservation属性是CommissionResult : public class Reservation implements java.io.Serializable { private CommissionResult commissionResult = null; } public class CommissionResult implements java.io.Serializable{ } import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.commons.SerialVersionUIDAdder; public class […]