C # сериализация структуры данных с объектами в нескольких списках / коллекциях - PullRequest
0 голосов
/ 20 июля 2010

В C # я хочу сериализовать структуру данных, в которой объекты могут принадлежать более чем одной коллекции.

Например, у меня есть класс Person.У меня также есть семейный класс и школьный класс, каждый из которых содержит MemberList.Экземпляр класса Person может присутствовать как в MemberList семьи, так и в школе.

Я хочу сериализовать всю структуру данных, но обеспокоен тем, что экземпляр класса Person в итоге будет сохранендва отдельных экземпляра, и после десериализации я получу два экземпляра вместо одного.Сериализатор достаточно умен, чтобы хранить данные, чтобы этого не произошло?Есть ли способ остановить это, если так?

Любая помощь или предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Насколько мне известно, он будет сериализовать весь граф объектов, поэтому экземпляры объектов будут дублироваться.Настраиваемая сериализация является единственной опцией, либо вручную, либо путем переопределения сериализации объекта по умолчанию - оба задействованы.

Я бы не стал слишком беспокоиться об этом, пока в любом случае это не станет проблемой.При первом прохождении будет хорошо сериализовать весь граф.

0 голосов
/ 20 июля 2010

Вы можете использовать DataContractSerializer (который используется WCF) и украшать каждый класс (Family и School) атрибутом DataContract и свойством IsReference, установленным в true, например:

[DataContract(IsReference=true)]
public class Family
{
    // ...
}

Это скажет DataContractSerializer, чтобы сохранить ссылки нетронутыми при воссоздании графа объекта при десериализации.

Вы можете сериализовать объект 'objectInstance' в поток с помощью DataContractSerializer следующим образом:

using (var stream = new MemoryStream())
{ 
    var serializer = new DataContractSerializer(objectInstance.GetType());
    serializer.WriteObject(stream, objectInstance);

    // The object has now been serialized to the stream
    // Do something with the stream here.
}

Обратите внимание, что на самом деле вам не нужно использовать WCF, вы можете просто использовать DataContractSerializer длясериализовать / десериализовать граф объектов.

Подробнее об этом атрибуте можно узнать на MSDN здесь .

Кроме того, вот базовый пример изкак использовать свойство IsReference.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...