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

时间:2016-01-28 12:00:04

标签: java wildfly infinispan wildfly-9

在设置群集期间,我遇到了WildFly / Infinispan尝试序列化很多类的问题,这些类可以在每个实例上重新创建 - 尽管无论出于何种原因他们似乎决定在群集中分发。

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

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

1 个答案:

答案 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