双括号初始化和序列化

Double Brace initialization and serialization

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

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");

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

谁能给我解释一下这是怎么回事?

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

一个解决方案是让 setter return 这个,而不是无效。然后你可以链接 setters.

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