서로 참조하는 두 객체를 직렬화하고 역 직렬화하면 어떻게됩니까? B b; } class B implements Serializable

보다 명확하게하기 위해 다음은 간단한 예입니다.

class A implements Serializable { public B b; }
class B implements Serializable { public A a; }
A a = new A();
B b = new B();
a.b = b;
b.a = a;

a와 b 객체를 파일로 직렬화하고 해당 파일에서 역 직렬화하면 어떻게됩니까?

나는 우리가 각각 2 개씩 4 개의 물체를 얻는다고 생각했다. 동일한 객체이지만 다른 인스턴스.

그러나 다른 것이 있는지 또는 옳고 그른지 확실하지 않습니다.

대답해야 할 기술이 있으면 Java를 기반으로 생각하십시오.

감사합니다.



답변

Java는 스트림에 기록 된 오브젝트를 추적하고 후속 인스턴스는 실제 직렬화 된 오브젝트가 아닌 ID로 작성됩니다.

예를 들어, 인스턴스 “a”를 스트림에 쓰면 스트림은 해당 객체에 고유 한 ID ( “1”)를 제공합니다. “a”직렬화의 일부로 “b”를 직렬화해야하며 스트림은 다른 ID ( “2”)를 제공합니다. 그런 다음 스트림에 “b”를 쓰면 실제 개체가 아닌 ID 만 기록됩니다.

입력 스트림은 반대로 동일한 작업을 수행합니다. 스트림에서 읽는 각 객체에 대해 출력 스트림과 동일한 알고리즘을 사용하여 ID 번호를 할당하고 해당 ID 번호는 맵에서 객체 인스턴스를 참조합니다. ID를 사용하여 직렬화 된 객체를 보면지도에서 원래 인스턴스를 검색합니다.

다음은 API 문서에서 설명하는 방법입니다.

단일 객체에 대한 여러 참조는 참조 공유 메커니즘을 사용하여 인코딩되므로 원본 그래프를 작성할 때와 동일한 모양으로 객체 그래프를 복원 할 수 있습니다.

이 동작은 문제를 일으킬 수 있습니다. 스트림은 각 객체에 대한 하드 참조를 보유하므로 (ID 대체시기를 알기 때문에) 일시적인 객체를 스트림에 많이 쓰면 메모리가 부족할 수 있습니다. 을 호출하여 문제를 해결할 수 reset()있습니다.


답변

Java에서는 직렬화 된 객체를 캐싱하고 다시 작성할 때 핸들을 작성하여 해결됩니다.

http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html의 5 단계를 참조하십시오 .


답변