作为一个小项目,我一直在尝试制作一个小东西来读取序列化的lambda(本地或从FTP)并调用它们的run函数,作为测试的一部分,以在Windows中试验文件关联(即打开某些文件类型会用某个程序打开它们)等等,但无论我尝试什么,它似乎都无法正确地反序列化。
lambda是这样宣布的
Runnable r = (Runnable & Serializable) () -> {
// blah blah
// made sure not to capture anything
};
并使用由ObjectOutputStream包装的[n可选]BufferedOutputStream包装的FileOutputStream进行序列化。然而,当[在另一个项目中]反序列化时,它失败了,说明它找不到包含序列化代码的封闭类。我尝试过各种方法,比如将它们包装在一个可序列化类中(出于测试目的,带serialVersionUID=0L),或者定义一个扩展Runnable和serializable的接口,但都没有用。
是的,我知道序列化lambdas并不是很好的做法(或者我们被告知),但我不知道如何将函数和子例程转换为可以存储为文件或FTP的内容。如果这根本不是正确的方式,一定要告诉别人。
哦,我正在使用最新版本的Eclipse Luna。
编辑:
像这样反序列化
File f = new File(somePath);
FileInputStream fish = new FileInputStream(f);
BufferedInputStream bos = new BufferedInputStream(fish); // not really necessary
ObjectInputStream ois = new ObjectInputStream(bos);
Runnable r = (Runnable) ois.readObject();
ois.close();
r.run();
反序列化对象时,执行反序列化的代码必须知道序列化对象的类。您不能序列化任意lambda并在另一个代码库中反序列化它。
序列化和反序列化代码或多或少必须在同一个代码库中,或者至少必须共享对包含原始lambda的代码的依赖关系。
如果没有类定义对象,则无法对其进行反序列化。lambda表达式没有改变这一点。
Lambda表达式要复杂一些,因为它们生成的运行时类不是定义它的类,但它们的定义类是保存Lambda主体代码的类,对于可序列化的Lambda,则是一个反序列化支持方法,用于验证和重新-
请参阅SerializedLambda
:
可序列化lambda的实现者(如编译器或语言运行库)应确保实例正确反序列化。这样做的一种方法是确保writeReplace方法返回SerializedLambda的实例,而不是允许进行默认序列化。
SerializedLambda
有一个readResolve
方法,它在捕获类中查找名为$desializeLambda$(SerializedLambda)
的(可能是私有的)静态方法,调用它作为第一个参数,并html" target="_blank">返回结果。实现$desializeLambda$
的Lambda类负责验证SerializedLambda
的属性与该类实际捕获的lambda一致。
因此,即使您的实例没有引用定义类内的合成方法(例如,在方法引用该类外的方法的情况下),反序列化仍然需要使用$$deserializeLambda$来验证实例的正确性。
关于序列化lambda的“良好实践”,请记住lambda表达式封装的是行为,而不是状态。存储行为总是意味着只存储某种引用,并要求用于恢复它的代码实现关联的行为。如果您仅通过符号名称引用预期行为或仅存储(例如关联的<代码>枚举 值),也可以这样做。
关于具有可序列化lambda的含义的更多信息将在本问题中解释。
问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是
问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的
问题内容: 在hibernate状态下执行条件查询时,出现以下异常: 可能是什么问题呢? PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。 问题答案: 问题在于被引用的实体对实体有另一个引用,并且该关系未由任何-like注释进行注释。
问题内容: 我正在使用Hibernate的两个表,但我不明白为什么对于特定查询我有此问题。我希望有人意识到这个问题。 我有一个桌子用户 和一个桌子区域 日志说: 问题答案: 我建议仅在字段或getter上设置注释。我更喜欢田野,但那只是我的口味。 请参阅Hibernate中有关字段和属性访问的奇怪案例: 因此,要么将注释仅放置在字段上,要么仅放置在getters(properties)上。混合它们
我想创建mysql字符串数组类型的数据字段。因此,我在我的spring-boot gradle项目中创建模型类,如下所示。 这是我的存储库,它通过JpaRepository扩展 但是当我在controller类中运行'getQuestions()'函数时,它给出了以下错误。 嵌套异常为org.hibernate.type.serializationexception:无法反序列化org.sprin
错误: 无法构造java.time.instant的实例:找不到合适的构造函数,无法从对象值反序列化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?) 修改Rest服务器以正确序列化Instant类后(例如:“FromTime”:1525681860) 因此,结论是RestEasyClient没有注册模块。我肯定做错了什么。