Double Brace初始化和序列化

时间:2015-03-31 07:44:23

标签: 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");

我知道这种语法糖会导致匿名课程的产生,但我不明白为什么它违反了可序列化的合同。

有人能解释一下我在这里发生了什么吗?

1 个答案:

答案 0 :(得分:3)

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

一种解决方案是让setter返回,而不是无效。然后你可以链接setters。

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