기본적으로 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" />
</X>
그러나 preserveObjectReferences 속성이 true로 설정되어 있어도 XsdDataContractExporter는 자체의 스키마에서 id 및 ref 특성을 설명하지 못합니다.
IsReference 사용
설명하는 스키마에 따라 올바른 개체 참조 정보를 생성하려면 형식에 DataContractAttribute 특성을 적용하고 IsReference 플래그를 true로 설정합니다. 위의 예제 클래스 X에서 다음과 같이 IsReference를 사용합니다.
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember(IsReference=true)]
public SomeClass A = someInstance;
[DataMember(IsReference=true)]
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가 적용되면 해당 멤버는 왕복될 때 계속해서 "참조 가능한" 것으로 인식됩니다.
참고 항목
참조
DataContractAttribute
CollectionDataContractAttribute
IsReference
IsReference