Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
По умолчанию 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 применении к элементу данных элемент по-прежнему распознается как ссылка при возврате в систему.