Разбираемся с Сериализацией в C#

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

Создавая объекты в приложении .NET Framework, вы, возможно, никогда не задумывались о том, как данные хранятся в памяти. Но когда требуется сохранять содержимое объекта в файле, передавать объект другому процессу или по сети, возникает необходимость преобразования его в другой формат. Такое преобразование называется сериализацией.
Сериализация представляет собой процесс преобразования объекта в поток байтов с целью сохранения его в памяти, в базе данных или в файле.
Основное назначение сериализации — сохранить состояние объекта для того, чтобы иметь возможность воссоздать его в случае необходимости.
Процесс обратный сериализации называется десериализацией.

Используемые атрибуты для сереализации:

Serializable Собственные классы можно будет сериализовать и десериализовать, если добавить к ним этот атрибут . Так же атрибут можно добавлять к классам, даже если на данный момент сериализация не является необходимой, для того, чтобы добавить ее поддержку на будущее.

NonSerialized Для отключения сериализации ненужных членов типа, например, полей, значение которых вычисляется в ходе работы программы, нужно использовать этот атрибут. Для автоматической инициализации таких полей после завершения десериализации рекомендуется использовать интерфейс IDeserializationCallback. Исполняющая среда будет вызывать метод OnDeserialization каждый раз после завершения десериализации класса.

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

Обойти это ограничение можно двумя способами:

  • Реализовать собственный метод сериализации.
  • Применить атрибут OptionalField к новым членам, способным вызвать проблемы с совместимостью.

OptionalField не влияет на процесс сериализации. Если член не был сериализован, во время десериализации исполняющая среда присвоит ему значение по умолчанию, и не будет генерировать исключение.

BinaryFormatter Serialization

BinaryFormatter-находится System.Runtime.Serialization.Formatters.Binary и является наиболее эффективным способом сериализации объектов. Но, к сожалению, он подходит только для .NET приложений. Если десериализацию будет выполнять другая среда, от BinaryFormatter придется отказаться.

 

SoapFormatter Serialization

SoapFormatter-расположен System.Runtime.Serialization.Formatters.Soap, основан на XML, представляет наиболее надежный способ сериализации объектов, которые будут передаваться по сети или считываться приложениями, не использующими .NET Framework. Однако является устаревшим на момент написания статьи и требует подключения ссылки.

SoapFormatter не поддерживает совместимость по сериализации между версиями .NET Framework. BinaryFormatter обеспечивает совместимость между версиями.

 

Методы интерфейса IDeserializationCallback:

void OnDeserialization(object sender) -вызывается после того, как завершился процесс десериализации.

XML Serialization

XML – это стандартный формат текстовых документов, подходящий для хранения информации, к которой будут обращаться приложения. System.Xml.Serialization
предоставляет методы преобразования объектов, в том числе и собственных классов, в XML-файлы и обратно.

Преимущества XML сериализации:

  • Больше возможностей взаимодействия.
  • Удобнее работать администраторам.
  • Улучшенная прямая совместимость.

Ограничения XML сериализации:

  • Можно сериализовать только открытые данные, закрытые данные таким образом не сериализуются
  • Нельзя сериализовать графы объектов, сериализация применима только к отдельным объектом

Чтобы сериализовать класс в формат XML, нужно выполнить следующее:

  • Объявить класс как открытый
  • Объявить все члены, которые нужно сериализовать, как открытые (public)
  • Создать конструктор, не принимающий параметров

Для применения XML сериализации класс не обязательно должен иметь атрибут Serializable.

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

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

Серелизация

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

 

Методы интерфейса ISerializable:

void GetObjectData(SerializationInfo info, StreamingContext context) -помещает данные, необходимые для корректной сериализации объекта в объект класса SerializationInfo

JSON Serialization

JSON сериализация в последнее время становиться самой популярной, это происходит из за того, что сериализация объектов может быть кроссплатформенной, а так же восприятия для человека и работа с таким синтаксисом намного легче чем в XML разметке. А альтернативные библиотеки которые используются для сериализации, на столько просты, что вы к ним быстро привыкните. Однако я их рассматривать не буду, а воспользуемся классом который входит в сборку net.framework. Для этого нам требуется подключить using System.Runtime.Serialization.Json; И воспользоваться по аналогии с предыдущими примерами сереализации и дисереализации.

 

 

 

 

 


Обновлено: 25.06.2018 — 09:40

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.