2010-07-20 2 views
0

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

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

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

Любая помощь или предложения оценены.

+1

какой сериализатор? –

+0

Какой бы ни был лучше работать и будет проще реализовать, я думаю. Я собирался пойти с XML, чтобы начать, поскольку он будет легко отлаживать, но если у этого есть ограничения, я бы рассмотрел что-то еще. – Caustix

ответ

0

Вы можете использовать DataContractSerializer (который используется WCF) и украсить каждый класс (семья и школа) с атрибутом DataContract и свойства «IsReference» значение ИСТИНА, например, так:

[DataContract(IsReference=true)] 
pubic 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 here.

Также, here is a basic example о том, как использовать свойство IsReference.

+0

Большое спасибо, эта вторая ссылка фантастическая! – Caustix

+0

Рад, что это помогло! Просто будьте осторожны, что DataContractSerializer по существу сериализуется в XML (предполагается, что он включен в сообщение SOAP), поэтому сериализованный формат не будет таким маленьким, как другие сериализаторы. Однако вы легко можете использовать сжатие GZIP (System.IO.Compression.GZipStream), чтобы свести к минимуму сериализованный формат перед его сохранением. – Sam

1

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

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

Смежные вопросы