Сериализация графа двоичных объектов

Мне нужен совет по сериализации в приложении .net. Приложение является настольным / толстым клиентским приложением, а сериализация представляет собой постоянный формат документа. Требования к сериализатору:

  • Должен разрешать сериализацию полей, а не только общедоступных свойств.
  • Не должны требовать конструкторы без параметров.
  • Должны обрабатывать общие графы объектов, то есть не только DAG, но и общие / двунаправленные ссылки.
  • Должен работать с классами фреймворка (например, Serialize Dictionaries).

В настоящее время мы используем BinaryFormatter, который достаточно хорошо обрабатывает все вышеперечисленное, но размер / производительность и устойчивость к версии являются проблемой. Мы используем атрибуты [OnDeserialized / ing] для обеспечения совместимости, но они не допускают крупных рефакторингов (например, изменение пространства имен) без сложного использования суррогатов и т. Д.

Идеальным решением была бы прямая замена для BinaryFormatter, который работает с нашими существующими аннотациями [NonSerialized] и т. Д., Но работает лучше и создает формат, который меньше и проще в обслуживании.

Я рассмотрел различные реализации protobuf, и хотя кажется возможным сериализовать общие объектные графы / перечисления / структуры в наши дни, сериализация сложного графа с большим количеством типов коллекций фреймворков не кажется тривиальной задачей. Кроме того, даже если бы мы могли заставить его работать с полями, а не свойствами, я понимаю, что это все равно означало бы необходимость добавить конструкторы без параметров и аннотации protobuf ко всем классам (домен составляет около 1000 классов).

Итак, вопросы:

  • Существуют ли какие-либо «альтернативные» двоичные форматеры, которые обеспечивают хорошо документированный формат, работают лучше?
  • Подходят ли буферы протоколов для сохранения больших общих графов объектов, включая типы фреймворков?
6
задан Anders Forsgren 3 August 2011 в 08:50
поделиться