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 true
wartość 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 true
wartość .
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.