java - 双括号初始化和序列化

标签 java serialization syntactic-sugar

我注意到一个奇怪的行为,当使用双括号初始化时,初始化的对象序列化失败:

queueVO.setUser(new UserVO() {{setIndex("admin");}});

将对象发送到 JMS 队列时导致以下错误:

javax.jms.JMSException: Failed to serialize object
at org.hornetq.jms.client.HornetQObjectMessage.setObject(HornetQObjectMessage.java:139)

否则一切都运行良好

queueVO.setUser(new UserVO());
queueVO.getUser().setIndex("admin");

我知道这种语法糖会导致创建匿名类,但我不明白为什么它会破坏可序列化的契约。

有人可以解释一下这里发生了什么吗?

最佳答案

创建的匿名类不是静态的,因此有一个 <SurroundingClass>.this ,它也会被序列化,或者更糟糕的是在对象重新加载后变成 null。

一种解决方案是让 setter 返回此值,而不是返回 void。然后你就可以链接 setter 了。

UserVO vo = new UserVO().setIndex("admin");

关于java - 双括号初始化和序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363254/

相关文章:

if (!result) 的 C++ 糖语法返回 false;

javascript - 使用 void 作为语法糖来防止隐式全局变量,是或否?

java - 如何在运行时集成来自不同类的 GUI 元素?

java - jackson JSON : get node name from json-tree

c# - Json 反序列化 C#

c# - 使用带有 IDictionary<Mycustomclass, List<string>> 的自定义解析器的反序列化问题

haskell - 是否可以在 Haskell 中使用自己的语法糖(如 do 表示法或箭头表示法)?

java - libgdx 加载资源、纹理打包器

java - 如何从 Twitter API Java JSON 获取所有 url 照片

java - 使用接口(interface)中的默认方法序列化 (BWC)