Реализация настраиваемой сериализации в несколько форматов: ISerializable или специальное решение?

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

Я ' Я изо всех сил пытаюсь прийти к решению о наилучшем способе решения этой проблемы и хотел бы получить некоторые мнения.

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

Кроме того, я не слишком заинтересован в том, чтобы весь код, специфичный для сериализации, «склеил» мою красивую чистоту. бизнес-объекты - я бы предпочел переложить эту ответственность на выделенный объект. Это также имеет смысл, когда существует ряд различных форматов, поскольку параметры сериализации могут быть расширены в будущем простым расширением базового класса или изменением без редактирования самих бизнес-объектов. Опять же, я бы предпочел не «изобретать велосипед».

Мне интересно, каков ваш коллективный опыт и мнения в подобных случаях?

Является ли ISerializable приемлемым вариантом для нескольких форматов? Интересно, каков ваш коллективный опыт и мнения в подобных случаях?

Является ли ISerializable приемлемым вариантом для нескольких форматов? Или пользовательский класс или сервис больше подходят для этой задачи? Существуют ли какие-либо шаблоны проектирования или дополнительные элементы инфраструктуры, которые охватывают эту область?

1
задан nukefusion 20 August 2010 в 09:35
поделиться

3 ответа

Вы можете использовать ISerializable , чтобы получить форму универсального промежуточного хранилища данных для каждого объекта ( SerializationInfo ), а затем реализовать три отдельных обработчика для этого промежуточного типа, чтобы превратить их в окончательную форму. Лично я определенно не хотел бы видеть три формы кода сериализации в одном бизнес-объекте.

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

1
ответ дан 2 September 2019 в 21:58
поделиться

Пользовательская сериализация в стиле .NET, полностью настраиваемая сериализация, просто маркировка классов и просто маркировка классов и добавление нескольких настроек - все это доступно:

Пользовательская сериализация полезна, когда:

  1. Объект полностью или частично неизменяем (один или несколько членов - только для чтения ) и, следовательно, в любом случае должны десериализоваться через конструктор (конечно, фабричный метод также может работать, вызывая существующий конструктор).
  2. Граф сложен, но многое из него можно упростить, зная систему (например, «Я знаю, что мне не нужно полностью сериализовать этот член, я могу просто сериализовать достаточно информации, чтобы создать новый экземпляр при десериализации».
  3. Класс общего назначения используется определенным образом (ну, они всегда так ...), и знание этих особенностей может снизить сложность графа.
  4. Вы выполняете XMLSeriazation класса, который наследует или реализует класс шаблона или абстрактный параметризованный сам по себе (это переходит в бесконечный цикл при отображении графа, по крайней мере, на IEnumerable , я не знаю, происходит ли это для всех таких интерфейсов, и я Я почти уверен, что этого не происходит с двоичной сериализацией - на самом деле это ошибка и ее нужно исправить, но пока она есть).
  5. Вам необходимо гарантировать обратную и / или прямую совместимость с более поздними версиями класса (вы должны убедиться, что это работает, но у вас нет надежды, если вы не «там»).
  6. У вас есть член класса, который вы не можете редактировать (предоставляется фреймворк или третья часть), который не может быть сериализован, поэтому вам необходимо предоставить свой собственный метод сериализации.

ISerialisable предоставит абстракцию (именованные элементы входят, именованные элементы выходят), которая, в свою очередь, используется для различных форматов.

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

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

Дальнейшие изменения могут быть внесены путем размещения [NonSerialized] на элементах, которые не следует сериализовать (скажем, у вас есть BigObject _big; int _bigID и доступ для мемоизов к _big путем отложенной загрузки на основе _bigID при первом доступе. В этом случае вы можете сериализовать только _bigID , пометив _big как несериализованный. ] IDeserializationCallback позволяет дальнейшие настройки, сообщая вашему классу, когда он только что был создан, путем десериализации.

1
ответ дан 2 September 2019 в 21:58
поделиться

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

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

0
ответ дан 2 September 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: