因此,我们将VersionedPortable用作Hazelcast协议,并且我们知道在序列化/反序列化时字段的顺序很重要。我们不了解的是如何处理序列化/反序列化类中的继承?
Class A {
int one;
int two;
void writePortable( PortableWriter writer ) {
writer.writeInt( "one", one );
writer.writeInt( "two", three );
}
}
Class B extends A {
int three;
void writePortable( PortableWriter writer ) {
super.writePortable(writer);
writer.writeInt( "three", one );
}
}
现在可以说我们在A类中添加了一个名为4的字段-然后顺序被破坏了。四个将在两个和三个之间序列化,这是不正确的。我唯一能想到的选择是仅在叶类中实现写入/读取方法,但是随着时间的推移将很难维护。另外,如果您有许多叶类,则很可能是错误的。有解决这个问题的更好方法吗?
答案 0 :(得分:0)
如果您打算更改层次结构,那么也许应该计划长期实施。例如,在A类final方法中使writePortable成为可能,以便子类不实施它。而是定义一个抽象(或空的impl)writePortableSubcl()方法。这样,A类的writePortable看起来像:
public final void writePortable(PortableWriter writer,..){ // 1)写出我的已知属性
// 2) call ...
writePortableSubclass(writer);
// 3) write my remaining added attributes
// as you add more attributes to subclasses, you'll have to
// follow this pattern to keep attributes in order. There is no magic api to do this for you.
}