我可以在 Hazelcast Portable 中使用无参数构造函数吗?
Can I use a no-arg constructor with Hazelcast Portable?
关于其可移植序列化机制的 Hazelcast 文档说您不必使用无参数构造函数。
https://hazelcast.org/mastering-hazelcast/#serialization-start
但是他们的示例代码显示字段是直接设置的。
@Override
public void readPortable(PortableReader reader) throws IOException {
System.out.println("Deserialize");
this.name = reader.readUTF("name");
}
并且用于创建被反序列化的 class 实例的工厂正在使用无参数构造函数。
@Override
public Portable create(int classId) {
switch (classId) {
case PERSON_CLASS_ID:
return new Person();
}
return null;
}
我是否正确地假设您没有被迫使用无参数构造函数,但在反序列化时不能使用它来设置字段值?您将如何处理诸如永不为空的字段之类的强制不变量,以及如何在不使 superclass 中的字段受到保护的情况下反序列化 subclass?
在反序列化时,您无法维护不变量,因为正在重建对象;所以有些字段只是没有设置。抵制这个毫无意义。
而且您不会被迫拥有 no-arg 构造函数。只要工厂能创建实例,HZ不管你怎么创建。
关于其可移植序列化机制的 Hazelcast 文档说您不必使用无参数构造函数。
https://hazelcast.org/mastering-hazelcast/#serialization-start
但是他们的示例代码显示字段是直接设置的。
@Override
public void readPortable(PortableReader reader) throws IOException {
System.out.println("Deserialize");
this.name = reader.readUTF("name");
}
并且用于创建被反序列化的 class 实例的工厂正在使用无参数构造函数。
@Override
public Portable create(int classId) {
switch (classId) {
case PERSON_CLASS_ID:
return new Person();
}
return null;
}
我是否正确地假设您没有被迫使用无参数构造函数,但在反序列化时不能使用它来设置字段值?您将如何处理诸如永不为空的字段之类的强制不变量,以及如何在不使 superclass 中的字段受到保护的情况下反序列化 subclass?
在反序列化时,您无法维护不变量,因为正在重建对象;所以有些字段只是没有设置。抵制这个毫无意义。
而且您不会被迫拥有 no-arg 构造函数。只要工厂能创建实例,HZ不管你怎么创建。