我试图了解序列化如何与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声明在可能的情况下使用私有修饰符,因为此类声明仅适用于立即声明的类--serialVersionUID字段作为继承成员并不有用。数组类不能声明显式的serialVersionUID,因此它们总是具有默认的计算值,但数组类不需要匹配serialVersionUID值。
我该怎么办?我如何在我的Lambda中定义它?
谢谢
SerialVersionUID
只与生成流标识符的类相关。如果serializable类有一个WriteReplace()
方法(也在serializable
文档中描述),该方法返回不同类的替代对象,则不是这种情况,因为这种表示形式与原始类完全分离。这是可序列化lambda实例的情况,请参见serializedlambda
:
可序列化lambda的实现者(如编译器或语言运行库)应确保实例正确反序列化。这样做的一种方法是确保WriteRePlace
方法返回SerializedLambda
的实例,而不是允许继续进行默认序列化。
因此,它是serializedlambda
的一个实例,最终出现在流中,因此该类有责任拥有稳定的序列化表示。不幸的是,这并不能保护您免受可能的不兼容。
在反序列化时,将调用定义lambda表达式的类的合成方法(与此和此答案相比较),该方法将拒绝与该类中lambda表达式的现有定义不匹配的反序列化尝试,而匹配可能取决于lambda定义的细微方面。请注意,即使使用Eclipse而不是javac
重新编译定义类也可能破坏序列化兼容性。
serializable
lambdas的安全性影响也不是。一般来说,我建议避免使用它。
我的系统中存在大量对象。定义如下: 现在,我需要将这些对象序列化为字节,以便将它们存储在redis服务器中,并在稍后取回以运行方法。 很明显,通常的序列化库在Java,如jackson,在这里是行不通的。为了运行代码,序列化的字节必须包含类信息。JDK序列化在这里是一个选项: 但是,通过这种方式,需要的所有子类以及从方法引用的类来实现接口,该接口很难控制。 所以,我想知道是否有另一种不需要各种限制
问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的
问题内容: 如何优雅地序列化lambda? 例如,下面的代码抛出。如何在不创建“虚拟”界面的情况下进行修复? 问题答案: Java 8引入了通过添加多个边界将对象转换为类型的交集的可能性。因此,在序列化的情况下,可以编写: 并且lambda自动变为可序列化的。
我在搞lambdas的Java序列化。 我有两个完全独立的项目,其中只有一个类。 项目1: 项目二: 但是,在尝试反序列化可运行文件时,它会抛出一个异常,说它找不到 ...我有什么办法可以避免这种情况吗?
作为一个小项目,我一直在尝试制作一个小东西来读取序列化的lambda(本地或从FTP)并调用它们的run函数,作为测试的一部分,以在Windows中试验文件关联(即打开某些文件类型会用某个程序打开它们)等等,但无论我尝试什么,它似乎都无法正确地反序列化。 lambda是这样宣布的 并使用由ObjectOutputStream包装的[n可选]BufferedOutputStream包装的FileOu
我们希望序列化Java类的模式,以便任何字段或类上存在的所有注释也序列化到模式中。 我没有找到这样做的工具。 Avro不处理非字符串映射键,FasterXML不处理循环引用。它们都不会将注释序列化到模式中。 是否有任何Java JSON(反)序列化程序可以做到这一点?
问题内容: 您如何向外行解释Passport的序列化和反序列化方法的工作流程。 叫到哪里去了? 我们紧接着在工作流程中调用它吗? 我仍在努力寻找解决方案。我有一个完整的工作应用程序,没有遇到任何类型的错误。 我只是想了解这里到底发生了什么? 任何帮助表示赞赏。 问题答案: 叫到哪里去了? 用户ID(您作为函数的第二个参数提供)被保存在会话中,以后用于通过函数检索整个对象。 确定应将用户对象的哪些数
Eclipse JDT编译器似乎有一个问题,在某些情况下,Java8个lamda没有正确反序列化,而是抛出一个。我正在使用最近的分布式维护版本,如下所示: 现有的bug/SO条目报告了在中已经(至少部分)解决的类似问题。我亲自验证了以下问题已经得到解决。 无法反序列化访问实例字段和方法的Java 8 lambda https://bugs.eclipse.org/bugs/show_bug.cgi