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]
}