다음을 통해 공유


상호 운영 가능한 개체 참조

기본적으로 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
{  
}  

PreserveObjectReferencesfalse(기본값)로 설정하면 다음 XML이 생성됩니다.

<X>  
   <A>contents of someInstance</A>  
   <B>contents of someInstance</B>  
</X>  

PreserveObjectReferencestrue로 설정하면 다음 XML이 생성됩니다.

<X>  
   <A id="1">contents of someInstance</A>  
   <B ref="1"></B>  
</X>  

그러나 XsdDataContractExporter 속성이 id로 설정되어 있어도 ref는 자체의 스키마에서 preserveObjectReferencestrue 특성을 설명하지 못합니다.

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 출력이 원래 가정된 스키마와 반드시 호환되지 않아도 됩니다. 즉, idref 특성이 serialize되었더라도 원래 스키마 때문에 이러한 특성 또는 모든 특성이 XML에서 발생하지 않았을 수 있습니다. 데이터 멤버에 IsReference가 적용되면 해당 멤버는 왕복될 때 계속해서 참조 가능한 것으로 인식됩니다.

참고 항목