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