在设置群集期间,我遇到了WildFly / Infinispan尝试序列化很多类的问题,这些类可以在每个实例上重新创建 - 尽管无论出于何种原因他们似乎决定在群集中分发。
最初我认为@Stateless注释会产生我想要的效果,虽然它会因为没有正确的构造函数而引发问题,所以我不相信这是我们正在寻找的。 p>
在每个类的基础上禁用此功能或覆盖序列化方法的正确方法是什么?
答案 0 :(得分:1)
请注意禁用所选类的序列化的方法。 在本地或在某些有限的开发环境中运行时,您的应用程序可能不需要“群集”并且不需要复制的sesssions或有状态实体。但是,一旦部署到测试或生产,它就可以集群化。如果你阻止了序列化,它就会被打破。
因此,最好的行动原因是确保您的类的“可序列化”,而不是强制阻止它。
如果您坚持禁用序列化,则从<distributable/>
删除web.xml
应该可以解决问题。
通过尝试使某些类可序列化,有时您会发现某些类成员的类型只是不可序列化的,并且您不能将类型交换为类似的类型,这将序列化。 然后使用以下技巧,只要它适用:
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);
}
}
}
如您所见,该类包含FileWriter
类型的字段。我们确保了对象 - &gt;字节序列化,标记为transient
。但是,在远程JVM上从字节返回此类时,您的FileWriter
字段字段将为null
。我们通过在反序列化期间重新创建它来避免这个问题(参见readObject()
方法)。
此示例的作用只是因为File
字段带有足够的状态才能成功重新创建FileWriter
。