Udostępnij za pośrednictwem


Odwołania do obiektów, które można współdziałać

Domyślnie DataContractSerializer serializuje obiekty według wartości. Za pomocą IsReference właściwości można poinstruować serializator kontraktu danych, aby zachować odwołania do obiektów podczas serializacji obiektów.

Wygenerowany kod XML

Rozważmy na przykład następujący obiekt:

[DataContract]  
public class X  
{  
    SomeClass someInstance = new SomeClass();  
    [DataMember]  
    public SomeClass A = someInstance;  
    [DataMember]  
    public SomeClass B = someInstance;  
}  
  
public class SomeClass
{  
}  

Po PreserveObjectReferences ustawieniu wartości false (wartość domyślna) generowany jest następujący kod XML:

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

Po PreserveObjectReferences ustawieniu na truewartość jest generowany następujący kod XML:

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

XsdDataContractExporter Jednak nie opisuje id atrybutów i ref w schemacie, nawet jeśli właściwość jest ustawiona preserveObjectReferences na truewartość .

Korzystanie z funkcji IsReference

Aby wygenerować informacje referencyjne dotyczące obiektu, które są prawidłowe zgodnie ze schematem, który go opisuje, zastosuj DataContractAttribute atrybut do typu i ustaw flagę IsReference na true. Poniższy przykład modyfikuje klasę X w poprzednim przykładzie, dodając polecenie IsReference:

[DataContract(IsReference=true)]
public class X
{  
     SomeClass someInstance = new SomeClass();
     [DataMember]
     public SomeClass A = someInstance;
     [DataMember]
     public SomeClass B = someInstance;
}
  
public class SomeClass
{
}  

Wygenerowany kod XML jest następujący:

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

Użycie IsReference zapewnia zgodność komunikatu w obie strony. Bez niego, gdy typ jest generowany na podstawie schematu, dane wyjściowe XML dla tego typu nie muszą być zgodne ze schematem pierwotnie zakładanym. Innymi słowy, mimo id że atrybuty i ref zostały serializowane, oryginalny schemat mógł uniemożliwić te atrybuty (lub wszystkie atrybuty) z wystąpienia w kodzie XML. Po IsReference zastosowaniu do elementu członkowskiego danych element członkowski nadal jest rozpoznawany jako odwołanie , gdy element jest zaokrąglony.

Zobacz też