2016-09-26 1 views
6

특히 readUnshared()의 방법에서 ObjectInputStream의 방법 "역 참조"는 무엇을 의미합니까? readUnshared를이 역 직렬화하기 위해 호출하는 경우 Java의 역 참조 란 무엇입니까?

나는이

의 용어가 온 다시 참조 (스트림에 이전에 기록 된 객체의 스트림 표현),의 ObjectStreamException가 될 것입니다 던져.

참조 : https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#readUnshared()

답변

4

ObjectOutputStream을 사용하여 개체를 serialize하면 스트림에서 이미 작성한 개체를 '기억'합니다. 동일한 객체를 다시 작성해야 할 경우 전체 객체를 다시 쓰지 않고 '역 참조'라는 식별자를 작성합니다.

받는 사람 도 수신 된 개체를 추적하고 이전 참조를 읽은 후 이전에 읽은 개체를 반환합니다.

answer by CoronA에서 설명했듯이 이것은 다른 객체를 직렬화하는 데 사용되지만 다른 JVM으로 직렬화 할 때 하나의 JVM에서 동일성이 유지되도록하기 위해 사용됩니다.

readUnshared (및 그 반대 부분 writeUnshared)은이 동작을 피하기 위해 사용됩니다. 즉, 읽기 (쓰여진) 객체가 고유하고 백 참조로 다시 사용되지 않도록합니다. 이것은 다소 진보되어 있으며, 본 적이 있거나 사용 해본 적이 있다는 것을 기억할 수는 없지만, 다시 한번 나는 직렬화의 사용법을 거의 보지 못합니다.

3

이 고려 :

class A { 
    B b; 
} 

class B { 
    String s; 
    A a; 
} 

및 다음 구조 :

A a = new A(); 
a.b = new B(); 
b.a = a; 

이러한 순환 구조가 직렬화하고 기능적으로 동일해야 역 직렬화 경우. b.aA의 임의의 인스턴스가 아니며 정확하게 b를 참조하는 인스턴스 여야합니다.

이 경우 b.a은 역 참조입니다. 왜냐하면 A는 ObjectInputStream의 B 앞에 읽혀지기 때문입니다.

+0

이는 역 참조가 의미하는 것이 아닙니다.순환 참조와 관련이 없지만 역 참조로 큰 이점을 얻을 수 있습니다. – 4castle

+0

'writeUnshared'를 사용하여 순환 구조를 직렬화하면'StackOverflowException'이 발생합니다. – 4castle

+1

내 견해로는 역 참조가 필요한 몇 가지 시나리오가 있습니다. 순환 참조도 그 중 일부입니다. 예 - writeUnshared는 아마도 실패 할 것입니다.하지만이 대답을 작성한 시점에는 아무도 readUnshared를 언급하지 않았습니다. – CoronA

1

역 참조는 이미 이전에 스트림에 쓰거나 읽은 동일한 개체에 대한 참조입니다. 스트림의 이전 객체에 대한 포인터와 같이 생각하면됩니다.

역 참조는 같은 스트림에서 여러 번 직렬화 된 경우 객체의 크기를 크게 줄이고 직렬화를 해제 할 때 참조 평등을 허용하므로 유용합니다.

사용 백 참조 :

Object obj = new Object(); 
obj == obj // true 
writeObject(obj); 
writeObject(obj); 
Object obj1 = readObject(); 
Object obj2 = readObject(); 
obj1 == obj2 // true 

우리가 참조를 사용하지 않은 경우, 마지막 문은 false 될 것이다.