Поделиться через


Ссылки на объекты взаимодействия

По умолчанию сериализует объекты по значению 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. Следующий пример изменяет класс 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 применении к элементу данных элемент по-прежнему распознается как ссылающийся при цикле споткнутых элементов.

См. также