Java 我可以更改可序列化类的成员变量类型吗?

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;

假设一个类实现了serializable,我序列化了该类的一个对象。这样,我更改了内部实现,将其中一个变量的数据类型从int更改为String。。在使用readresolve进行反序列化时,是否可以从序列化对象获取值

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));
     }
}