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

Wil*_*nne 7 java infinispan wildfly wildfly-9

在设置集群期间,我遇到了WildFly/Infinispan的问题,试图序列化一些可以在每个实例上重新创建的类 - 尽管无论出于什么原因它们似乎决定在集群中分发.

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

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

dig*_*ise 1

没有答案的

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

因此,最好的行动理由是确保类的“可串行性”,而不是强制阻止它。

序列化关闭答案

如果您坚持禁用序列化,<distributable/>则从您的web.xmlshould 中删除即可解决问题。

序列化不可序列化答案

通过尝试使某些类可序列化,有时您会发现某些类成员的类型根本不可序列化,并且您无法将类型交换为类似的可序列化的类型。然后使用以下技巧(只要它适用):

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成功重新创建。