Serialization Library

Полное название: 
Nereal.Serialization Library
Параметры проекта
Значимость: 
Средняя
Средства: 
dotnet
Средства: 
c#
Средства: 
xml
Дата начала: 
2010-10-01
Участники: 
Тхэнн Эраннор
Состояние: 
Активен

Объединение всего накопленного опыта реализаций сериализаторов воедино, плюс некоторые дополнительные фишки, чтобы получить в итоге полноценную библиотеку, пригодную к дальнейшему использованию. Формат сериализации — XML.

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

  1. Сериализация любых классов/структур, даже вообще без их подготовки к тому. Сериализует при этом все публичные свойства и поля. Для встроенных значимых типов (int, string, и т.д.) сериализует просто их значение.
  2. Обращение к рефлексии только один раз при инициализации типа, в дальнейшем все работает через динамические методы доступа к свойствам. Что дает весьма приличную скорость.
  3. Полностью поточные и однопроходные чтение/запись XML.
  4. Инициализация информации о типах происходит автоматически при первом обращении к типу, или же по желанию может быть произведена заранее.
  5. Возможность десериализации классов и структур, не имеющих конструктора без параметров. Все параметры конструктора должны быть доступны в виде полей или свойств (можно и readonly). Соответствие свойств и параметров указывается либо атрибутом ConstructorParameters к типу, либо вызовом метода регистрации, если нет возможности добавить атрибут.
  6. Почти полное исключение приведения типов к object и обратно, везде только генерики. Что еще плюс к скорости, благодаря отсутствию боксинга (создания объекта в куче) для значимых типов, тот же int везде и всегда передается по значению. (к object приводятся только параметры конструкторов).
  7. Поддержка сериализации енумов, массивов, списков (List<T>), и словарей (Dictionary<TKey, TValue>).
  8. Возможность собственной реализации способа сериализации для любого типа или группы типов.
  9. Полная поддержка наследования типов без каких-либо дополнительных действий. Если тип объекта не тот же, что и тип свойства, а его потомок, то информация о типе тоже сохранится, и восстановится при десериализации.
  10. Из предыдущего пункта так же следует поддержка интерфейсов и абстрактных типов, в этих случае тип объекта сохраняется всегда.
  11. Поддержка десериализации readonly-свойств путем обновления существующих объектов вместо создания новых. Возможно для списков, словарей, и любых объектов с конструктором по умолчанию.
  12. Возможность указания конкретным иерархиям типов собственного способа сохранения типа, путем указания им атрибута TypeResolver. По умолчанию сохраняется в виде xml-атрибута type, в значении которого полное имя типа. Стандартно так же предлагается вариант собственной идентификации типов по атрибуту TypeId.
  13. Возможность настройки вида сохранения полей и свойств, путем указания им атрибутов XmlName, XmlStoreInElement, KeyName, и KeyedValue.
  14. Возможность сохранения полей и свойств в виде другого типа (ключа), путем указания им атрибута KeyedStore. Перевод ключа в значение и обратно не должен зависеть от самих сериализуемых данных. Если же оно зависит, то следует использовать ссылки.
  15. Возможность указания собственного произвольного порядка сериализации, с помощью атрибута MemberOrder.
  16. Возможность указания свойствам значения по умолчанию (атрибут DefaultValue), при котором это свойство не сохранится в xml. При десериализации, соответственно, свойство окажется того же значения по умолчанию.
  17. Поддержка ссылочных свойств, путем указания им атрибута Reference. В этом случае сохраняется не сам объект, содержащийся в свойстве, а его ключ-идентификатор. При десериализации по ключу восстанавливается объект и оказывается в свойстве.
  18. Помимо основной задачи сериализации, на той же основе реализованы операции глубокого клонирования и сравнения объектов.
  19. У всех типов и их членов указана xml-документация, в основном только summary. Язык документации — русский.

Недостатки и отсутствующие возможности:

  • Общая документация. Пока даже не представляю, в каком виде её писать. (Кроме xmldoc-комментариев к классам, методам, и свойствам, которые уже есть.)
  • Обработка null. Пока такие свойства не сохраняются вовсе, и при десериализации, соответственно, оказываются пустыми, то есть null.
  • Поддержка кастомной сериализации. Пока отсутствует интерфейс ISerializable для собственной его реализации различными классами, но будет добавлен.
  • Поддержка сериализации иных системных типов и коллекций, помимо перечисленных выше. Будет добавляться по мере надобности.
  • Лицензия. Пока оно в закрытом виде в собственном svn-репозитарии, нужно ли делать открытым, не знаю.