在Hazelcast中序列化类层次结构的最佳方式是什么



我想在Hazelcast中序列化并缓存一个与另一个@Entity具有双向关系的@Entity。

我正在寻找在这种情况下被认为是官方最佳实践的解决方案:

  1. 正确序列化可能包含null的类层次结构引用以及对集合和列表的引用
  2. 处理图中的参考循环

到目前为止,我通过在图中的每个@Entity中实现DataSerializable,成功地实现了前者。我以以下方式处理null和集合:

@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeBoolean(certificationNumber != null);
if (certificationNumber != null)
out.writeUTF(certificationNumber);
out.writeShort(getSkills().size());
for (SkillEntity s: getSkills())
s.writeData(out);
}

@Override
public void readData(ObjectDataInput in) throws IOException {
if (in.readBoolean()) {
certification = new CertificationEntity();
certification.readData(in);
}
short size = in.readShort();
skills = new HashSet<>();
for(int i=0; i<size; i++)
skills.add(in.readObject());
}

然而,打破参考周期更具挑战性。此线程建议:

我认为这将基于维护线程本地映射。

在序列化时,您需要查找要序列化的对象已经在那张地图上了。。如果是这样的话…你需要序列化某种占位符(如uuid(

如果它不在地图中,则生成一个占位符并将其放在地图中然后编写实际对象,您可能想要编写占位符,以便在反序列化时使用此信息。

我认为这应该会让你走上正确的方向,但既然我以前没有实现过,我不知道是否有什么问题在这里

虽然上面的建议非常合理,但我不太确定如何进行,即应用什么软件工程模式,以及如何将我的实体与序列化逻辑干净地分离。

有指针吗?

我想我的问题的答案在"掌握Hazelcast 3.9"手册的第201页,该手册可以从Hazelccast网站下载。

页面内容:

public class PersonKryoSerializer implements StreamSerializer<Person> {
private static final ThreadLocal<Kryo> kryoThreadLocal
= new ThreadLocal<Kryo>() {
@Override
protected Kryo initialValue() {
Kryo kryo = new Kryo();
kryo.register(Person.class);
return kryo;
}
};
@Override
public int getTypeId() {
return 2;
}
@Override
public void write(ObjectDataOutput objectDataOutput, Person product)
throws IOException {
Kryo kryo = kryoThreadLocal.get();
Output output = new Output((OutputStream) objectDataOutput);
kryo.writeObject(output, product);
output.flush();
}
@Override
public Person read(ObjectDataInput objectDataInput)
throws IOException {
InputStream in = (InputStream) objectDataInput;
Input input = new Input(in);
Kryo kryo = kryoThreadLocal.get();
return kryo.readObject(input, Person.class);
}
@Override
public void destroy() {
}
}

PersonKryoSerializer实现起来相对简单。漂亮的问题是Kryo负责周期检测,并产生了很多比Java序列化更小的序列化数据。为了我们的一个我们设法将地图条目的大小从15使用Java序列化的平均KB数,小于6 KB平均的当我们启用Kryo压缩时,我们设法使其低于3千字节。

最新更新