如何为便携式枚举实现 Hazelcast PortableFactory

How to implement Hazelcast PortableFactory for Portable enum

我有一个 Java 枚举 A,我想用 Hazelcast Portable 接口进行序列化。

要实现与 A 关联的 PortableFactory,我需要调用空构造函数来创建 A 的空实例,但这是Java.

中的枚举是不可能的

实现 PortableFactory 以序列化枚举的最佳方法是什么?

这是我想要实现的示例:

public class MyPortableFactory implements PortableFactory {

    @Override
    public Portable create( int classId ) {
        if (Foo.ID == classId) {
            return new Foo(); //This is how you return normal class
        } else if(MyEnum.ID == classId) {
            return ???; //What should I return for the enum?
        } else {
            return null;
        }
    }
}

我尝试了使用地图更改 ID 的解决方法:

public enum MyEnum implements Portable { 

    Value1("1", "1", PortableIds.one),
    Value2("2", "2", PortableIds.two),
    Invalid("0", "0", PortableIds.InvalidID);


    private String first;
    private String second;
    private Integer portableId;

    public static final Map<Integer, MyEnum> mapPortableIdValues = new HashMap<>() {{
        for (MyEnum myEnum : MyEnum.values()) {
            put(myEnum.getPortableId(), myEnum);
        }
    }};

    @Override
    public int getFactoryId() {
        return MyPortableFactory.FACTORY_ID;
    }

    @Override
    public int getClassId() {
        return portableId;
    }

public class MyPortableFactory implements PortableFactory {

    public static final int FACTORY_ID = 2;

    @Override
    public Portable create(int classId) {
        if(mapPortableIdValues.containsKey(classId)){
            return mapPortableIdValues.get(classId);
        }
        return null;
    }
}
public interface PortableIds {

    Integer one = 100;
    Integer two = 101;
    Integer InvalidID = 106;
}

但是当我 运行 我的应用程序出现以下异常时:

com.hazelcast.nio.serialization.HazelcastSerializationException: Wrong Portable type! Generic portable types are not supported! Expected class-id: 100, Actual class-id: 106
    at com.hazelcast.internal.serialization.impl.portable.DefaultPortableWriter.checkPortableAttributes(DefaultPortableWriter.java:174)
    at com.hazelcast.internal.serialization.impl.portable.DefaultPortableWriter.writePortable(DefaultPortableWriter.java:147)

我认为这个用例不太适合便携式序列化的设计。可移植序列化机制实例化一个 class 的实例,并在运行时用 readPortable 方法填充字段。这对于枚举来说是不可能的。

我建议使用包装器 class 来携带一个整数枚举标记或枚举成员的名称作为具有可移植序列化的字符串。