我有点困惑你的问题 - 也许是因为我没有看到任何问题与相同的对象和/或多个对象的序列化和反序列化,有或没有任何对象的引用。
重点是序列化就像创建对象的副本(在文件系统或某处)。这个副本可以在内存中重新创建(反序列化)。 您可以在内存中创建对象(反序列化)一次或多次。
它是这样的:
object A --serialization--> file A
file A --deserialization--> object A'
file A --deserialization--> object A"
对象A,A”和A”是不同的对象 - 但所有字段将拥有相同的价值观。
如果对象A包含一个复杂的结构(可以序列化/反序列化),它也可以是另一个对象,那么同样的机制也可以用于这些对象。
所有字段将具有相同的值,但对象将不同。
看的示例代码:
package test;
import java.io.Serializable;
public class Person implements Serializable {
int id;
String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
和一种测试
package test;
import java.io.*;
public class Main {
public static void main(String... args) {
Person p1 = new Person(1, "aaa");
Person p1a = null;
Person p1b = null;
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.data"))) {
oos.writeObject(p1);
} catch (IOException e) {
e.printStackTrace();
}
try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) {
p1a = (Person) oos.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) {
p1b = (Person) oos.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
assert p1a != null && p1b != null;
assert p1a.id == p1b.id;
assert p1.id == p1b.id;
assert p1.name.equals(p1a.name);
assert p1a.name.equals(p1b.name);
System.out.println(String.format("Three different object: %s, %s, %s", p1, p1a, p1b));
}
}
PS的。 java.lang.String
如何在内存中复制/存储/管理对象,这是不同的故事。
来源
2017-09-27 08:01:27
THM
您必须使用Person的集合并对其进行序列化。 –