Java 反序列化将覆盖当前对象吗?

Java 反序列化将覆盖当前对象吗?,java,serialization,Java,Serialization,如果保存(序列化)一个对象,修改未序列化的对象,然后反序列化该对象,会发生什么。对象的反序列化版本会简单地覆盖修改过的版本吗?或者我必须专门删除现有对象(或者做一些其他操作以确保正确的反序列化) PS谢谢您的回复。它们确实很有帮助。当反序列化对象时,您可以选择如何处理返回的反序列化对象引用。它不会影响类中的任何其他对象 假设您有一个名为programObject的MyObjectType类型的对象。要序列化此对象,可以执行以下操作: ObjectOutputStream outputStream

如果保存(序列化)一个对象,修改未序列化的对象,然后反序列化该对象,会发生什么。对象的反序列化版本会简单地覆盖修改过的版本吗?或者我必须专门删除现有对象(或者做一些其他操作以确保正确的反序列化)


PS谢谢您的回复。它们确实很有帮助。

当反序列化对象时,您可以选择如何处理返回的反序列化对象引用。它不会影响类中的任何其他对象

假设您有一个名为programObject的MyObjectType类型的对象。要序列化此对象,可以执行以下操作:

ObjectOutputStream outputStream = new ObjectOutputStream(
    new FileOutputStream("fileToWriteTo.dat");
这会将输出流设置为写入“fileToWriteTo.dat”。然后,要序列化此对象,请执行以下操作:

outputStream.writeObject(programObject);
要将对象返回到程序中,请创建如下输入流:

ObjectInputStream inputStream = new ObjectInputStream(
    new FileInputStream("fileToWriteTo.dat");
下面的代码将反序列化给定输入流中的对象,并将其作为类型对象返回(因此转换为MyObjectType)

这将有效地覆盖programObject。如果不想这样做,只需将读入对象保存到新对象:

MyObjectType newObject = (MyObjectType) inputStream.readObject();

序列化意味着将
对象的当前状态转换为其他形式。序列化版本与原始对象完全分离,因此对原始对象所做的更改不会影响序列化版本

当您反序列化对象时,您会得到一个新对象,其状态与序列化时的原始对象相同

理解这一点的最好方法是举个例子。这里我们从一个列表
[1,2,3]
开始,序列化该列表,然后通过添加
4
来修改原始列表。当我们反序列化原始文件时,会得到一个只包含
[1,2,3]
的新列表。为简单起见,我已将对象保存到字节数组中,但我可以轻松地将其保存到文件中

public static void main(String[] args) throws Exception {

    // Create a list
    List<Integer> original = new ArrayList<>(Arrays.asList(1, 2, 3));

    // Serialize the list as a byte array
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    new ObjectOutputStream(baos).writeObject(original);
    byte[] serializedList = baos.toByteArray();

    // Modify the list
    original.add(4);

    // Deserialize the original
    Object newList = new ObjectInputStream(new ByteArrayInputStream(serializedList)).readObject();

    // Print the 2 versions
    System.out.println(original);       // [1, 2, 3, 4]
    System.out.println(newList);        // [1, 2, 3]
}
publicstaticvoidmain(字符串[]args)引发异常{
//创建一个列表
List original=newarraylist(Arrays.asList(1,2,3));
//将列表序列化为字节数组
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
新的ObjectOutputStream(baos).writeObject(原始);
byte[]serializedList=baos.toByteArray();
//修改列表
原件。添加(4);
//反序列化原始文件
Object newList=newobjectinputstream(new ByteArrayInputStream(serializedList)).readObject();
//打印两个版本
System.out.println(原件);//[1,2,3,4]
System.out.println(newList);//[1,2,3]
}
反序列化生成一个新对象。
public static void main(String[] args) throws Exception {

    // Create a list
    List<Integer> original = new ArrayList<>(Arrays.asList(1, 2, 3));

    // Serialize the list as a byte array
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    new ObjectOutputStream(baos).writeObject(original);
    byte[] serializedList = baos.toByteArray();

    // Modify the list
    original.add(4);

    // Deserialize the original
    Object newList = new ObjectInputStream(new ByteArrayInputStream(serializedList)).readObject();

    // Print the 2 versions
    System.out.println(original);       // [1, 2, 3, 4]
    System.out.println(newList);        // [1, 2, 3]
}