Java 如何禁用试图序列化集群应用程序中某些类的Wildfly 9.0.2

Java 如何禁用试图序列化集群应用程序中某些类的Wildfly 9.0.2,java,wildfly,infinispan,wildfly-9,Java,Wildfly,Infinispan,Wildfly 9,在建立集群的过程中,我遇到了一个问题,就是WildFly/Infinispan试图序列化一些可以在每个实例上重新创建的类,尽管出于某种原因,它们似乎决定在集群中分布 起初我认为@Stateless注释会产生我想要的效果,尽管它会因为没有正确的构造函数而引发问题,所以我不相信这就是我们要寻找的 在每个类的基础上,禁用或覆盖序列化方法的正确方法是什么?非答案 请注意禁用选定类的序列化的方法。 当在本地或某些有限的开发环境中运行时,您的应用程序可能不需要“集群化”,也不需要复制会话或有状态实体。然而,

在建立集群的过程中,我遇到了一个问题,就是WildFly/Infinispan试图序列化一些可以在每个实例上重新创建的类,尽管出于某种原因,它们似乎决定在集群中分布

起初我认为@Stateless注释会产生我想要的效果,尽管它会因为没有正确的构造函数而引发问题,所以我不相信这就是我们要寻找的

在每个类的基础上,禁用或覆盖序列化方法的正确方法是什么?

非答案 请注意禁用选定类的序列化的方法。 当在本地或某些有限的开发环境中运行时,您的应用程序可能不需要“集群化”,也不需要复制会话或有状态实体。然而,一旦部署到测试或生产环境中,它就可以集群化。如果您阻止了序列化,那么它将被破坏

因此,最好的措施是确保类的“序列化”,而不是强制阻止它

不正确答案 如果您坚持要禁用序列化,那么从
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
类型的字段。我们通过标记对象
transient
来确保对象->字节序列化。但是,在远程JVM上,当从字节返回此类时,
FileWriter
字段将为
null
。我们通过在反序列化过程中重新创建它来避免这个问题(请参见
readObject()
method)


此示例之所以有效,是因为
File
字段具有足够的状态,可以成功地重新创建
FileWriter

你所说的“保持完全有状态是好的”是什么意思?另外,使用
@Stateful
将类转换为一个有状态EJB,然后自动分布在集群中以提供容错性。你是对的,我使用了错误的注释,我现在再试一次>我的措辞不正确,我的意思是,我不希望它集群化——我希望每个实例都有自己的版本。您应该能够使用
@Stateless
@Singleton
来实现这一点,但在这种情况下,您需要向类中添加一个无参数构造函数。好的,谢谢您的支持。我将开始重新编写以摆脱构造函数。我将用progressnothavemeasured报告,它仍然试图用@Stateless注释序列化市场上的内容。