我使用Java进行了序列化测试。我发现Java序列化可以正确处理循环引用。但是Java序列化如何解决循环引用问题?
以下代码正常工作:
public class SerializableTest {
static class Employee implements Serializable{
private static final long serialVersionUID = 1L;
String name;
int age;
Employee leader;
public void say(){
System.out.println("my name is " + name + ". and I'm " + age + " years old.");
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream(new File("tempPath")));
Employee employee = new Employee();
employee.name = "Tom";
employee.age = 41;
employee.leader = employee;
employee.say();
objectOutput.writeObject(employee);
ObjectInput objectInput = new ObjectInputStream(new FileInputStream(new File("tempPath")));
Employee readEmployee = (Employee) objectInput.readObject();
readEmployee.say();
readEmployee.leader.say();
}
}
Java序列化使用IdentityHashMap
来映射它尝试序列化为id的每个引用。第一次序列化对象时,它将写入其内容和ID。之后,它只写允许循环引用的id和一个对象的一个副本,无论它被引用了多少次。
缺点是,如果保留Object流而不调用reset()
它,则会保留您曾经发送的每个对象,从而导致内存使用量增加。同样,如果您更改对象并再次发送它,更改将不会很明显,因为它仅将引用再次发送给该对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句