Interoperabilní odkazy na objekty
Ve výchozím nastavení DataContractSerializer serializuje objekty podle hodnoty. Vlastnost lze použít IsReference k pokyn serializátoru kontraktu dat, aby při serializaci objektů zachoval odkazy na objekty.
Vygenerovaný XML
Jako příklad vezměte v úvahu následující objekt:
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
Při PreserveObjectReferences nastavení na false
(výchozí) se vygeneruje následující XML:
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
Při PreserveObjectReferences nastavení se true
vygeneruje následující KÓD XML:
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
XsdDataContractExporter Ale nepopisuje id
atributy ref
v jeho schématu, i když preserveObjectReferences
je vlastnost nastavena na true
.
Použití isReference
Chcete-li vygenerovat referenční informace objektu, které jsou platné podle schématu, které jej popisují, použijte DataContractAttribute atribut na typ a nastavte IsReference příznak na true
. Následující příklad upraví třídu X
v předchozím příkladu přidáním IsReference
:
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
Vygenerovaný kód XML je následující:
<X>
<A id="1">
<Value>contents of A</Value>
</A>
<B ref="1"></B>
</X>
Použití IsReference
zajišťuje dodržování předpisů při odezvě zpráv. Bez toho, když je typ generován ze schématu, výstup XML pro tento typ není nutně kompatibilní s původně předpokládaným schématem. Jinými slovy, i když byly id
atributy ref
serializovány, původní schéma mohlo znamenat, že tyto atributy (nebo všechny atributy) nebyly v xml. S IsReference
použitím u datového členu bude člen při zaokrouhlení dál rozpoznán jako odkazovatelný .