상호 운영 가능한 개체 참조
기본적으로 DataContractSerializer는 개체를 값으로 serialize합니다. IsReference 속성을 사용하여 데이터 계약 Serializer에 해당 개체를 serialize할 때 개체 참조를 유지하도록 지시할 수 있습니다.
생성된 XML
예를 들어 다음과 같은 개체를 살펴보세요.
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
PreserveObjectReferences를 false
(기본값)로 설정하면 다음 XML이 생성됩니다.
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
PreserveObjectReferences를 true
로 설정하면 다음 XML이 생성됩니다.
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
그러나 XsdDataContractExporter 속성이 id
로 설정되어 있어도 ref
는 자체의 스키마에서 preserveObjectReferences
및 true
특성을 설명하지 못합니다.
IsReference 사용
설명하는 스키마에 따라 올바른 개체 참조 정보를 생성하려면 형식에 DataContractAttribute 특성을 적용하고 IsReference 플래그를 true
로 설정합니다. 다음 예제에서는 IsReference
를 추가하여 이전 예제의 클래스 X
를 수정합니다.
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
생성되는 XML은 다음과 같습니다.
<X>
<A id="1">
<Value>contents of A</Value>
</A>
<B ref="1"></B>
</X>
IsReference
를 사용하면 메시지 라운드트립이 준수됩니다. 사용하지 않으면 스키마에서 형식이 생성될 때 해당 형식에 대해 XML 출력이 원래 가정된 스키마와 반드시 호환되지 않아도 됩니다. 즉, id
및 ref
특성이 serialize되었더라도 원래 스키마 때문에 이러한 특성 또는 모든 특성이 XML에서 발생하지 않았을 수 있습니다. 데이터 멤버에 IsReference
가 적용되면 해당 멤버는 왕복될 때 계속해서 참조 가능한 것으로 인식됩니다.