Бөлісу құралы:


Ссылки на интероперабельные объекты

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

См. также