С приложением, которое я сейчас разрабатываю, я столкнулся с необходимостью сериализации некоторых бизнес-объектов во множество различных проприетарных форматов.
Я ' Я изо всех сил пытаюсь прийти к решению о наилучшем способе решения этой проблемы и хотел бы получить некоторые мнения.
Я знаю, что .NET предоставляет нам интерфейс ISerializable
, который я могу реализовать на своих бизнес-объектах, однако Я' Я изо всех сил пытаюсь понять, как это могло бы справиться, когда мне нужно сериализовать, возможно, в 3 различных формата?
Кроме того, я не слишком заинтересован в том, чтобы весь код, специфичный для сериализации, «склеил» мою красивую чистоту. бизнес-объекты - я бы предпочел переложить эту ответственность на выделенный объект. Это также имеет смысл, когда существует ряд различных форматов, поскольку параметры сериализации могут быть расширены в будущем простым расширением базового класса или изменением без редактирования самих бизнес-объектов. Опять же, я бы предпочел не «изобретать велосипед».
Мне интересно, каков ваш коллективный опыт и мнения в подобных случаях?
Является ли ISerializable
приемлемым вариантом для нескольких форматов? Интересно, каков ваш коллективный опыт и мнения в подобных случаях?
Является ли ISerializable
приемлемым вариантом для нескольких форматов?
Или пользовательский класс или сервис больше подходят для этой задачи?
Существуют ли какие-либо шаблоны проектирования или дополнительные элементы инфраструктуры, которые охватывают эту область?
Вы можете использовать ISerializable
, чтобы получить форму универсального промежуточного хранилища данных для каждого объекта ( SerializationInfo
), а затем реализовать три отдельных обработчика для этого промежуточного типа, чтобы превратить их в окончательную форму. Лично я определенно не хотел бы видеть три формы кода сериализации в одном бизнес-объекте.
В зависимости от количества и сложности ваших объектов может быть проще создать собственный интерфейс, в который каждый класс должен поддерживать сериализацию. Это дает вам полную гибкость за счет невозможности использования стандартных битов сериализации.
Пользовательская сериализация в стиле .NET, полностью настраиваемая сериализация, просто маркировка классов и просто маркировка классов и добавление нескольких настроек - все это доступно:
Пользовательская сериализация полезна, когда:
только для чтения
) и, следовательно, в любом случае должны десериализоваться через конструктор (конечно, фабричный метод также может работать, вызывая существующий конструктор). IEnumerable
, я не знаю, происходит ли это для всех таких интерфейсов, и я Я почти уверен, что этого не происходит с двоичной сериализацией - на самом деле это ошибка и ее нужно исправить, но пока она есть).ISerialisable предоставит абстракцию (именованные элементы входят, именованные элементы выходят), которая, в свою очередь, используется для различных форматов.
Если вам нужен очень специфический формат (например, сериализованный по определенному шаблону), вам может потребоваться взглянуть на другие интерфейсы (например, IXmlSerializable) на предмет более явного использования методов сериализации или игнорирования предоставленных .NET методы сериализации и использование собственных средств для создания и анализа различных форматов.
С другой стороны, вы можете просто поместить атрибут [Serializable]
в класс и любой класс, членом которого он является, и это даст вам поведение сериализации по умолчанию.
Дальнейшие изменения могут быть внесены путем размещения [NonSerialized]
на элементах, которые не следует сериализовать (скажем, у вас есть BigObject _big; int _bigID
и доступ для мемоизов к _big
путем отложенной загрузки на основе _bigID
при первом доступе. В этом случае вы можете сериализовать только _bigID
, пометив _big
как несериализованный. ] IDeserializationCallback
позволяет дальнейшие настройки, сообщая вашему классу, когда он только что был создан, путем десериализации.
Похоже, вам нужен собственный сериализатор для каждого формата, в который вы хотите сериализовать свой объект. Как я упоминал в своем комментарии, вы можете взять один и тот же объект и сериализовать его с помощью сериализатора Json, и он даст вам Json-представление этого объекта, сериализует его с помощью сериализатора XML, и вы получите XML и т. Д.
Так что для каждого из ваших форматов вам просто нужен настраиваемый сериализатор, который может сериализовать / десериализовать его в этот формат и из него.