Udostępnij przez


Odwołania do obiektów interoperacyjnych

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
{  
}  

Gdy PreserveObjectReferences jest ustawione na false (wartość domyślna), generowany jest następujący kod XML:

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

Przy ustawieniu PreserveObjectReferences na true, generowany jest następujący kod XML:

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

XsdDataContractExporter nie opisuje atrybutów id i ref w swojej definicji schematu, nawet gdy właściwość preserveObjectReferences jest ustawiona na wartość true.

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 niezmienność komunikatów przesyłanych 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 że atrybuty id i ref zostały zserializowane, oryginalny schemat mógł uniemożliwić pojawienie się tych atrybutów (lub wszystkich atrybutów) w XML-u. Po zastosowaniu IsReference do elementu danych, element ten nadal jest rozpoznawany jako możliwy do odwołania podczas dwukierunkowego transferu.

Zobacz także