Wil*_*nne 7 java infinispan wildfly wildfly-9
在设置集群期间,我遇到了WildFly/Infinispan的问题,试图序列化一些可以在每个实例上重新创建的类 - 尽管无论出于什么原因它们似乎决定在集群中分发.
最初我认为@Stateless注释会产生我想要的效果,虽然它会因为没有正确的构造函数而引发问题,所以我不相信这是我们正在寻找的.
在每个类的基础上禁用此方法或覆盖序列化方法的正确方法是什么?
请小心禁用所选类的序列化的方法。当在本地或某些有限的开发环境中运行时,您的应用程序可能不需要“集群”,也不需要复制会话或有状态实体。然而,一旦部署到测试或生产,它就可以集群化。如果你阻止了序列化,那么它就会被破坏。
因此,最好的行动理由是确保类的“可串行性”,而不是强制阻止它。
如果您坚持禁用序列化,<distributable/>
则从您的web.xml
should 中删除即可解决问题。
通过尝试使某些类可序列化,有时您会发现某些类成员的类型根本不可序列化,并且您无法将类型交换为类似的可序列化的类型。然后使用以下技巧(只要它适用):
public class ClassForcedToBeSerializable implements Serializable {
transient private FileWriter writer; //FileWriter is not serializable!!!
private final File file;
public ClassForcedToBeSerializable(File file) throws IOException {
this.file = file;
this.writer = new FileWriter(file);
}
//FLESH AND BONES HERE
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
if (writer == null) {
this.writer = new FileWriter(file);
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该类包含FileWriter
类型字段。我们通过标记来确保对象 -> 字节序列化transient
。然而,在远程 JVM 上,当此类从字节带回时,您的FileWriter
字段字段将为null
. 我们通过在反序列化期间重新创建它来避免这个问题(参见readObject()
方法)。
此示例之所以有效,只是因为该File
字段携带足够的状态以FileWriter
成功重新创建。
归档时间: |
|
查看次数: |
356 次 |
最近记录: |