Hazelcast-什么是可移植序列化的Map属性的读写方法

时间:2018-08-31 14:57:51

标签: java hazelcast

我正在Hazelcast中实现可移植序列化。我正在将一个Java对象(员工)保存到hazelcast中,其中包含 Map 类型的属性。在这里可以使用什么方法来序列化此 map 属性?

public class Employee implements Serializable, Portable {
    private String name;
    private Map<Integer, Address> addresses;

    // getters and setters

    @Override
    public int getFactoryId() {
        return 1;
    }

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

    @Override
    public void writePortable(PortableWriter writer) throws IOException {
        writer.writeUTF("name", name);
        // how to write addresses field here
    }

    @Override
    public void readPortable(PortableReader reader) throws IOException {
        name = reader.readUTF("name");
        // how to read addresses field here
    }
}

地图值“地址”也实现了可移植性,并具有必需的读写方法。

2 个答案:

答案 0 :(得分:0)

我相信您不能直接执行此操作,因为您需要同时实现可移植性的Map实现。不幸的是,Hazelcast似乎没有提供。

但是,您可以改用PortableCollection。在写入时,通过调用构造函数并传递Map.entrySet()结果(一个集合),将地图包装到PortableCollection实例中。在读取时,从反序列化的值创建Map实例。但是请注意,这样做不会将各个映射值以可移植格式进行序列化!而是使用原始序列化器。

如果您想对整个内容进行可移植序列化,我想您必须自己实现一个可移植地图。

(在此处使用Hazelcast 3.7.3)

答案 1 :(得分:0)

@JavaCodeNet,如果Address不是Portable,则在编写完所有原始对象和Portable对象之后,可以调用writer.getRawDataOutput(),这将返回一个{{1} }。如果ObjectDataOutput实现了Java可序列化,则可以使用它来调用writer.getRawDataOutput().writeData(addresses)

如果没有,并且它实现了其他Address或其他第三方序列化器的Hazelcast序列化接口,那么您需要先进行项目计数,然后使用相同的DataSerializable metmod分别遍历map和序列化条目并执行阅读时也一样。