Нужен точный учебник по сериализации и десериализации иерархии классов в c#

#c# #xml-serialization

#c# #xml-сериализация

Вопрос:

Пожалуйста, предоставьте мне точный учебник / веб-ссылку для сериализации и десериализации иерархии классов в c #.

Ответ №1:

Вы могли бы использовать класс XmlSerializer:

 var instance = new SomeClass();
var serializer = new XmlSerializer(typeof(SomeClass));
using (var writer = XmlWriter.Create("output.xml"))
{
    serializer.Serialize(writer, instance);
}
  

и для десериализации:

 var serializer = new XmlSerializer(typeof(SomeClass));
using (var reader = XmlReader.Create("output.xml"))
{
    var instance = (SomeClass)serializer.Deserialize(reader);
}
  

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

Другим популярным классом, обычно используемым для сериализации XML, является DataContractSerializer, который используется WCF, но может быть использован в любом приложении.

Комментарии:

1. (в качестве дополнительного примечания к OP; DataContractSerializer может не дать вам вполне идиоматический xml, который вы могли бы ожидать от XmlSerializer — и при этом он не дает вам большого контроля влиять на макет (но это действительно стоит упомянуть; он делает несколько вещей, которые XmlSerializer не может — но это не замена 1: 1)

Ответ №2:

На самом базовом уровне сериализация xml может быть такой же простой, как развертывание XmlSerializer и использование его. Однако вы можете использовать много-много атрибутов, чтобы влиять на сериализатор, или использовать XmlAttributeOverrides , если вы не можете аннотировать. В частности, поскольку вы упомянули иерархию, вы захотите:

 [XmlInclude(typeof(SomeDerivedType))]
public class Foo {}

public class SomeDerivedType : Foo {}
  

Другие примечания по XmlSerializer :

  • тип должен быть общедоступным
  • рассматриваются только общедоступные свойства и поля
  • должен существовать общедоступный конструктор без параметров (или конструктор по умолчанию)
  • это сериализатор дерева, поэтому ссылки на объекты не сохраняются (вы можете использовать [XmlIgnore] , чтобы избежать перехода вверх по «родительским» свойствам)
  • вы также можете реализовать IXmlSerializable , если хотите пользовательскую сериализацию, но я не рекомендую это
  • обратные вызовы сериализатора не поддерживаются

Ответ №3:

Глубокая сериализация: двоичная сериализация и сериализация SOAP с общим уклоном

Сериализация позволяет преобразовать график объектов в линейную последовательность байтов, XML или SOAP. Как только объект сглажен, вы можете сохранить его или отправить по сети. Затем сериализованные данные могут быть десериализованы. Десериализация, по сути, воссоздает график объектов, которые вы изначально сериализовали. Сериализация звучит сложно, но на практике это довольно просто, потому что .NET framework берет на себя большую часть сложностей за вас.

Комментарии:

1. Теги вопросов требуют сериализации xml… который на самом деле вообще не рассматривается в этой статье. Он затрагивает SoapFormatter , но этот класс по существу устарел. На самом деле, ИМО, ни один из методов, подробно описанных в этой статье, не должен использоваться … никогда.