Подтвердить что ты не робот

Какая наиболее гибкая сериализация для .NET-объектов, но простая в реализации?

Я хотел бы сериализовать и десериализовать объекты, не беспокоясь о всем графе классов.

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

Это означает, что двоичная сериализация это не вариант, поскольку он работает только с другие платформы .NET. я бы также как что-то читаемое человека, и, таким образом, дешифровать программа управления и другие переводчики.

Я нашел проблемы с использованием DataContract, JSON и XML Serializers.

  • Большинство этих ошибок, похоже, сосредоточены вокруг Сериализации списков/Словари (т.е. XML Serializable Generic Dictionary).
  • "Добавить любые типы, не известные статически к списку известных типов - для например, используя Атрибут KnownTypeAttribute или добавив их в список известных типы, переданные DataContractSerializer ".

Пожалуйста, основывайте свои ответы на реальных опытах, а не на теории или чтении статьи.

4b9b3361

Ответ 1

Вы рассматривали сериализацию в JSON вместо XML?

Json.NET имеет действительно мощный и гибкий сериализатор, который не имеет проблем с Hashtables/generic dictionaries и не требует каких-либо конкретных атрибутов. Я знаю, потому что я написал это:)

Он дает вам кучи контроля с помощью различных опций в сериализаторе и позволяет вам переопределить, как тип сериализуется, создав для него JsonConverter.

По моему мнению, JSON более читабельна для людей, чем XML, и Json.NET дает возможность писать красиво отформатированный JSON.

Наконец, проект является открытым исходным кодом, поэтому вы можете войти в код и внести изменения, если вам нужно.

Ответ 2

Если я напомню, что это работает с этим свойством:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

Если вы сериализовали это, вы получите что-то вроде:

<Foo>
    <Bar />
    <Bar />
</Foo>

Конечно, я, вероятно, должен отдать предпочтение экспертам. Здесь больше информации от MS: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

Сообщите мне, если это сработает для вас.

Ответ 3

Из ваших требований это звучит, как лучше всего подходит Xml Serialization.

Какие проблемы возникают с коллекциями при сериализации? Если вы имеете в виду не знать, какие атрибуты использовать в списке или что-то подобное, вы можете попробовать Атрибут XmlArray для вашего свойства. Вы можете определенно сериализовать коллекцию.

Ответ 4

Промежуточный Сериализатор в XNA Framework довольно прост. Вы можете найти кучу учебников по ее использованию в http://blogs.msdn.com/shawnhar

Ответ 5

Сериализация SOAP хорошо работала для меня даже для объектов, не отмеченных [Serializable]

Ответ 6

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

Ответ 7

Поместите все классы, которые вы хотите сериализовать, в отдельную сборку, а затем используйте инструмент sgen для создания сериализационной сборки для сериализации в XML. Используйте атрибуты XML для управления сериализацией.

Если вам нужно настроить сборку сериализации (и вам понадобится поддержка классов, которые не являются IXmlSerializable, и классы, содержащие абстрактные узлы), затем инструктируйте sgen выгрузить исходный код в отдельный файл и затем добавить его в ваше решение. Затем вы можете изменить его по мере необходимости.

http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

FWIW, мне удалось выполнить сериализацию всей платформы AdsML (более 400 классов), используя эту технику. Это потребовало много ручной настройки, но там не обойтись, если учесть размер рамки. (Я использовал отдельный инструмент для перехода от XSD к С#)

Ответ 8

Я согласен с тем, что методы сериализации на основе DataContract (для JSON, XML и т.д.) немного сложнее, чем хотелось бы.

Если вы пытаетесь запустить JSON http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

Это часть расширений MS AJAX. По общему признанию он помечен как устаревший в .NET 3.5, но ScottGu упоминает в своем комментарии к блогу здесь (http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973), что он не уверен, почему и что должен поддерживаться немного дольше.

Ответ 9

Простейшей задачей является отметить ваши объекты атрибутом Serializable, а затем использовать двоичный форматтер для обработки сериализации. Весь граф классов не должен быть проблемой при условии, что любые содержащиеся объекты также отмечены как Serializable.

Ответ 10

Возможно, более эффективным маршрутом будет сериализация с использованием BinaryFormatter

Как скопировано из http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

Ответ 11

Для интероперабельности мы всегда использовали Xml Serialization и убедились, что наш класс был разработан с нуля, чтобы сделать это правильно.

Мы создаем документ схемы XSD и генерируем набор классов из этого, используя XSD.exe. Это порождает частичные классы, поэтому мы создаем набор соответствующих частичных классов для добавления дополнительных методов, которые мы хотим помочь нам заполнить классы и использовать их в нашем приложении (поскольку они ориентированы на сериализацию и десериализацию и немного затрудняют использование иногда).

Ответ 12

Вам следует использовать NetDataContractSerializer. Он охватывает любой тип графа объектов и поддерживает дженерики, списки, полиморфизм (здесь не нужен атрибут KnownType), рекурсия и т.д. Единственный недостаток заключается в том, что вы должны пометить все классы с помощью атрибутов [Serializable]/[DataContract], но опыт показывает, что вы должны выполнить какую-то ручную тонкую настройку, так как не все члены должны сохраняться. Также он сериализуется в Xml, хотя его читаемость сомнительна.

У нас были те же требования, что и у вас, и выбрали это решение.