我注意到一个奇怪的行为,当使用双括号初始化时,初始化的对象序列化失败:
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/