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