可互作的对象引用

默认情况下, 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 在其架构中未描述 idref 属性,即使 preserveObjectReferences 属性已设置为 true

使用 IsReference

若要根据描述它的架构生成有效的对象引用信息,请将 DataContractAttribute 属性应用于类型,并将标志设置为 IsReferencetrue。 以下示例通过添加X来修改上一示例中的类IsReference

[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 应用于某个数据成员时,该成员在往返时会继续被识别为“可引用”

另请参阅