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

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

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

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

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

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

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

Ответы [ 12 ]

0 голосов
/ 20 сентября 2008

Возможно, более эффективным маршрутом будет сериализация с использованием 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;
   }
}
0 голосов
/ 20 сентября 2008

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

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