可互操作的对象引用
默认情况下,DataContractSerializer 按值序列化对象。 可以使用 IsReference 属性指示数据协定序列化程序在序列化对象时保留对象引用。
生成的 XML
例如,请考虑下面的对象:
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
当 PreserveObjectReferences 设置为 false
(默认值)时,会生成下面的 XML:
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
当 PreserveObjectReferences 设置为 true
时,会生成下面的 XML:
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
但是,XsdDataContractExporter 不在其架构中描述 id
和 ref
特性,即使当 preserveObjectReferences
属性设置为 true
时也是如此。
使用 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 输出不一定与最初设定的架构兼容。 换言之,虽然 id
和 ref
属性进行了序列化,但原始架构可能禁止这些属性(或所有属性)在 XML 中出现。 将 IsReference
应用于某个数据成员时,该成员在往返时会继续被识别为“可引用”。