Java 我可以更改可序列化类的成员变量类型吗?
假设一个类实现了serializable,我序列化了该类的一个对象。这样,我更改了内部实现,将其中一个变量的数据类型从int更改为String。。在使用readresolve进行反序列化时,是否可以从序列化对象获取值Java 我可以更改可序列化类的成员变量类型吗?,java,serialization,Java,Serialization,假设一个类实现了serializable,我序列化了该类的一个对象。这样,我更改了内部实现,将其中一个变量的数据类型从int更改为String。。在使用readresolve进行反序列化时,是否可以从序列化对象获取值 Class A implements Serializable{ private int first; private int second; } 序列化之后: Class A implements Serializable{ private int first;
Class A implements Serializable{
private int first;
private int second;
}
序列化之后:
Class A implements Serializable{
private int first;
private String second;
}
您需要实现一个自定义的readObject()方法。更多信息
serialVersionUID在类的两个版本中也需要相同。如果尚未声明serialVersionUID,jvm将根据类的形状计算它。要使其工作,您需要在类的新版本中显式声明旧的serialVersionUID。更多信息您需要实现一个定制的readObject()方法。更多信息 serialVersionUID在类的两个版本中也需要相同。如果尚未声明serialVersionUID,jvm将根据类的形状计算它。要使其工作,您需要在类的新版本中显式声明旧的serialVersionUID。更多信息。让我们试试这个(未编译) 如果其中一个字段是
final
,则需要readResolve
古怪或更糟
(几乎将最后一个secondInt
保留为second
,Boo嘶嘶声传到String.valueOf
)无聊。让我们试试这个(未编译)
如果其中一个字段是final
,则需要readResolve
古怪或更糟
(几乎将最后一个
secondInt
保留为second
在那里。嘘嘘到String.valueOf
)为什么不试试呢?将类保存到文件中,更改它,然后尝试读取它(提示:更改现有成员的类型是不兼容的更改)。为什么不尝试呢?将类保存到文件中,更改它,然后尝试读取它(提示:更改现有成员的类型是不兼容的更改)。如果添加新字段,还需要.serialversionId。。。用于更改数据成员的数据类型。。我应该怎么做?您还需要定义serialPersistentFields
来指定旧类型。您可以使用不同的名称为此添加额外的序列化字段。(您还需要一个writeObject
方法。)如果我要添加一个新字段,还需要.serialversionId本身。。。用于更改数据成员的数据类型。。我应该怎么做?您还需要定义serialPersistentFields
来指定旧类型。您可以使用不同的名称为此添加额外的序列化字段。(您还需要一个writeObject
方法。)
import java.io.*;
class A implements Serializable {
private static final long serialVersionUID = 0x...L;
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("first", int.class),
new ObjectStreamField("second", int.class),
new ObjectStreamField("secondString", String.class),
};
private int first;
private String second;
private void writeObject(ObjectOutputStream out) throws IOException {
ObjectOutputStream.PutField fields = out.putFields();
fields.put("first", first);
int secondInt;
try {
secondInt = Integer.parseInt(second);
} catch (NumberFormatException exc) {
secondInt = -1;
}
fields.put("second", secondInt);
fields.put("secondString", second);
}
private void readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = out.readFields();
fields = fields.get("first", 0);
int secondInt = fields.get("second", 0);
second = (String)field.get("secondString", Integer.toString(secondInt));
}
}