我注意到一个奇怪的行为,当使用双括号初始化时,初始化的对象序列化失败:
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");
我知道这种语法糖会导致匿名课程的产生,但我不明白为什么它违反了可序列化的合同。
有人能解释一下我在这里发生了什么吗?
答案 0 :(得分:3)
创建的匿名类是不是静态的,所以有一个<SurroundingClass>.this
,它也会被序列化,或者在重新加载对象后变得更糟。
一种解决方案是让setter返回,而不是无效。然后你可以链接setters。
UserVO vo = new UserVO().setIndex("admin");