다른 개체 (예 : 인스턴스 B 및 C)를 참조하는 개체 인스턴스 A가 있고 A를 파일로 이진 serialize하는 경우 어떻게됩니까? 이제 A, B 및 C가 포함 된 데이터를 직렬화 했습니까?.NET Binary 다른 개체에 대한 참조를 사용하여 개체를 serialize합니다. . . 무슨 일이야?
정확히 어떻게 작동합니까? 데이터를 비 직렬화하면 어떻게됩니까? A, B 및 C ??
(내부 작업 설명도 포함 시켜도됩니다.)
다른 개체 (예 : 인스턴스 B 및 C)를 참조하는 개체 인스턴스 A가 있고 A를 파일로 이진 serialize하는 경우 어떻게됩니까? 이제 A, B 및 C가 포함 된 데이터를 직렬화 했습니까?.NET Binary 다른 개체에 대한 참조를 사용하여 개체를 serialize합니다. . . 무슨 일이야?
정확히 어떻게 작동합니까? 데이터를 비 직렬화하면 어떻게됩니까? A, B 및 C ??
(내부 작업 설명도 포함 시켜도됩니다.)
다른 개체에 대한 참조도 모두 일련 번호로 표시됩니다. 데이터를 직렬화 해제하면 객체 A, B 및 C를 포함하여 데이터의 완전한 작업 세트로 끝납니다. XML 직렬화와 달리 이진 직렬화의 주요 이점 일 것입니다.
오브젝트에 참조가있는 클래스가있는 경우 [Serializable]
attribute으로 표시되지 않은 경우 런타임에 SerializationException
이 표시되며 이미지는 웹에서 훔쳐서 도용 당했으며 런타임 오류는 표시되지 않습니다. '는 t에도 VS의 현재 버전)에서 더 이상 같이 :
또한보다, 내가 "내부 상황이"당신이 이해하기를 바라고 있었는지 정말 모르겠어요. 직렬화는 reflection을 사용하여 객체의 공개 및 비공개 필드를 거쳐 궁극적으로 데이터 스트림에 기록되는 바이트 스트림으로 변환합니다. 직렬화 복원 중에는 데이터 스트림에서 바이트 스트림을 읽습니다.이 스트림은 유형 정보와 함께 객체의 정확한 복제를 합성하는 데 사용됩니다. 개체의 모든 필드는 이전에 보유한 값과 같습니다. 생성자는 이 아니며 객체가 deserialize 될 때 호출됩니다.이 아닙니다. 그것에 대해 생각하는 가장 쉬운 방법은 객체의 즉석 스냅 샷을 가져 와서 원하는대로 원래 상태로 복원 할 수 있다는 것입니다.
실제 직렬화 및 직렬화 해제를 담당하는 클래스는 포맷터 (항상 IFormatter
interface에서 상속)입니다. 그것은 "객체 그래프"를 생성하는 것입니다.이 객체 그래프는 루트로 직렬화/역 직렬화되는 객체를 포함하는 일반화 된 트리입니다. 위에서 언급했듯이 포매터는 리플렉션을 사용하여이 객체 그래프를 살펴보고 해당 객체에 포함 된 모든 객체 참조를 직렬화/역 직렬화합니다. 포매터는 그래프의 객체를 두 번 이상 직렬화하지 않는 것을 알만큼 지능적입니다. 두 개의 객체 참조가 실제로 동일한 객체를 가리키는 경우이 객체가 감지되고 해당 객체는 한 번만 직렬화됩니다.이 논리와 다른 논리는 무한 루프를 입력하는 것을 방지합니다.
물론이 프로세스가 어떻게 작동하는지 잘 이해할 수 있습니다. 실제로 구현하는 코드를 직접 작성하는 것이 어렵습니다. 다행히도 이미 완료되었습니다. .NET Framework의 요점은 복잡한 직렬화 논리가 모두 내장되어 있으므로 걱정할 필요가 없습니다. 나는이 모든 것을 스스로 이해한다고 주장하지는 않으며, 그것이 제공하는 기능을 최대한 활용할 필요가 없다. 손으로 모든 코드를 작성한 지 오래다. 구현 세부 사항을 염려하지 말고 기뻐해야합니다. :-)
주 개체가 참조하는 개체는 [Serializable]이어야합니다. 모든 것을 제공하는 것은 포맷터에 의해 자동으로 수행됩니다.
첫째, 개체 A의 형식은 [Serializable] 특성으로 태그 지정되어야합니다. 직렬화 A는 멤버의 유형에 [Serializable] 태그가 붙은 경우 (또는 B 및 C의 유형이 [Serializable]로 표시된 경우 예제를 사용) 모든 비공개 또는 공용 멤버 데이터를 직렬화합니다. 직접 또는 간접적으로 [Serializable]이 아닌 유형의 데이터를 직렬화하려고 시도하면 예외가 발생합니다.
다수 내장 .NET 유형의 이미로 표시된 [직렬화] 등을 선택 System.Int32 (INT), 선택 System.Boolean (부울)를 포함
당신은 .NET에 대한 자세한 내용을보실 수 있습니다 여기에서 직렬화 : http://msdn.microsoft.com/en-us/library/4abbf6k0.aspx.
고마워요 코디, 정확히 내가 찾고 있던 것입니다. 내가 물건의 interal 동작을 요청하는 이유는 내가 정말로 이해하지 않고, 내가하지 않는 한 "ah ha"를 얻는다라는 것이다. 나는 그것을 얻고 그것을 기억하기 위해 모든 것을 시각화해야합니다. 좋은 대답에 다시 한번 감사드립니다. – richard
@ 리차드 : 물론. 나는 그것이 나 자신과 거의 같기 때문에 그것이 어떻게되는지를 이해한다. 나는 너를 이해하려고 노력해서는 안되는 것을 극복하려고 애 쓰지 않았다. 오히려 "여기서부터 매우 복잡해집니다"라고 말하면서 약간의 지식만으로도 그것이 어떻게 작동하는지 이해할 가치가 없습니다. 어쨌든, 오신 것을 환영합니다. –