2010-07-20 4 views
0

C#에서는 개체가 둘 이상의 컬렉션에 속할 수있는 데이터 구조를 serialize하고자합니다.여러 목록/컬렉션에있는 개체를 사용하는 C# serializing 데이터 구조

예를 들어 Person 클래스가 있습니다. 또한 각자 MemberList를 포함하고있는 Family 클래스와 School 클래스가 있습니다. Person 클래스의 인스턴스는 Family 및 School의 MemberList에 모두 존재할 수 있습니다.

전체 데이터 구조를 직렬화하고 싶지만 Person 클래스의 인스턴스가 두 개의 별도 인스턴스로 저장 될 것이고 deserialisation이 끝날 때마다 하나가 아닌 두 개의 인스턴스로 끝날 것이라고 우려하고 있습니다. serialiser가 데이터를 저장하기에 충분히 영리합니까? 그렇게하지 마십시오. 그렇다면이 일을 막을 수있는 방법이 있습니까?

도움이나 제안.

+1

어떤 시리얼 라이저? –

+0

어느 것이 든 가장 잘 작동하고 구현하기가 쉽습니다. 디버깅하기 쉽기 때문에 시작하기 위해 XML을 사용할 것입니다.하지만 제한이 있다면 뭔가 다른 것을 고려할 것입니다. – Caustix

답변

0

당신은 (WCF에서 사용하는)을 DataContractSerializer를 사용하는 등처럼를 DataContract 속성을 true로 설정 한 'IsReference'속성 (가족 및 학교) 각 클래스를 꾸밀 수 :

[DataContract(IsReference=true)] 
pubic class Family 
{ 

이를 deserialization에서 개체 그래프를 다시 만들 때 참조를 그대로 유지하도록 DataContractSerializer에 지시합니다.

당신과 같이 DataContractSerializer와 스트림에 객체의 ObjectInstance '를 직렬화 할 수 있습니다 : 당신이 실제로, 당신은 단지 직렬화 할 DataContractSerializer를 사용할 수 있습니다 WCF를 사용할 필요가 없습니다

using (var stream = new MemoryStream()) 
{ 
    var serializer = new DataContractSerializer(objectInstance.GetType()); 
    serializer.WriteObject(stream, objectInstance); 

    // The object has now been serialized to the stream 
    // Do something with the stream here. 
} 

/를 직렬화 개체 그래프.

이 특성에 대한 자세한 내용은 MSDN here에서 읽을 수 있습니다.

또한 'IsReference'속성 사용 방법은 here is a basic example입니다.

+0

대단히 감사합니다. 두 번째 링크는 환상적입니다! – Caustix

+0

도움이 되니 기쁩니다! DataContractSerializer가 본질적으로 XML (SOAP 메시지에 포함되도록되어 있음)로 직렬화되므로 직렬화 된 형식이 다른 serializer만큼 작지는 않습니다. 그러나 GZIP 압축 (System.IO.Compression.GZipStream)을 사용하면 저장하기 전에 직렬화 된 형식을 쉽게 최소화 할 수 있습니다. – Sam

1

개체 그래프가 전체적으로 직렬화되어 있으므로 개체 인스턴스가 복제됩니다. 사용자 지정 직렬화는 수동으로 또는 개체의 기본 직렬화를 재정 의하여 선택하는 유일한 옵션입니다. 둘 다 관련되어 있습니다.

어쨌든 문제가 될 때까지 걱정하지 않으려 고합니다. 먼저 전체 그래프를 직렬화하는 것이 좋을 것입니다.