我正在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
}
}
地图值“地址”也实现了可移植性,并具有必需的读写方法。
答案 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和序列化条目并执行阅读时也一样。