Объединение всего накопленного опыта реализаций сериализаторов воедино, плюс некоторые дополнительные фишки, чтобы получить в итоге полноценную библиотеку, пригодную к дальнейшему использованию. Формат сериализации — XML.
Прошлая попытка уже потерялась за несколькими переписываниями, так что даже и упоминать не буду.
Текущая реализация была написана примерно за полторы недели увлеченного размышления и программирования, попутно несколько раз в корне переделана. Плюс две недели небольших доработок. Особенности библиотеки:
Сериализация любых классов/структур, даже вообще без их подготовки к тому. Сериализует при этом все публичные свойства и поля. Для встроенных значимых типов (int, string, и т.д.) сериализует просто их значение.
Обращение к рефлексии только один раз при инициализации типа, в дальнейшем все работает через динамические методы доступа к свойствам. Что дает весьма приличную скорость.
Полностью поточные и однопроходные чтение/запись XML.
Инициализация информации о типах происходит автоматически при первом обращении к типу, или же по желанию может быть произведена заранее.
Возможность десериализации классов и структур, не имеющих конструктора без параметров. Все параметры конструктора должны быть доступны в виде полей или свойств (можно и readonly). Соответствие свойств и параметров указывается либо атрибутом ConstructorParameters к типу, либо вызовом метода регистрации, если нет возможности добавить атрибут.
Почти полное исключение приведения типов к object и обратно, везде только генерики. Что еще плюс к скорости, благодаря отсутствию боксинга (создания объекта в куче) для значимых типов, тот же int везде и всегда передается по значению. (к object приводятся только параметры конструкторов).
Поддержка сериализации енумов, массивов, списков (List<T>), и словарей (Dictionary<TKey, TValue>).
Возможность собственной реализации способа сериализации для любого типа или группы типов.
Полная поддержка наследования типов без каких-либо дополнительных действий. Если тип объекта не тот же, что и тип свойства, а его потомок, то информация о типе тоже сохранится, и восстановится при десериализации.
Из предыдущего пункта так же следует поддержка интерфейсов и абстрактных типов, в этих случае тип объекта сохраняется всегда.
Поддержка десериализации readonly-свойств путем обновления существующих объектов вместо создания новых. Возможно для списков, словарей, и любых объектов с конструктором по умолчанию.
Возможность указания конкретным иерархиям типов собственного способа сохранения типа, путем указания им атрибута TypeResolver. По умолчанию сохраняется в виде xml-атрибута type, в значении которого полное имя типа. Стандартно так же предлагается вариант собственной идентификации типов по атрибуту TypeId.
Возможность настройки вида сохранения полей и свойств, путем указания им атрибутов XmlName, XmlStoreInElement, KeyName, и KeyedValue.
Возможность сохранения полей и свойств в виде другого типа (ключа), путем указания им атрибута KeyedStore. Перевод ключа в значение и обратно не должен зависеть от самих сериализуемых данных. Если же оно зависит, то следует использовать ссылки.
Возможность указания собственного произвольного порядка сериализации, с помощью атрибута MemberOrder.
Возможность указания свойствам значения по умолчанию (атрибут DefaultValue), при котором это свойство не сохранится в xml. При десериализации, соответственно, свойство окажется того же значения по умолчанию.
Поддержка ссылочных свойств, путем указания им атрибута Reference. В этом случае сохраняется не сам объект, содержащийся в свойстве, а его ключ-идентификатор. При десериализации по ключу восстанавливается объект и оказывается в свойстве.
Помимо основной задачи сериализации, на той же основе реализованы операции глубокого клонирования и сравнения объектов.
У всех типов и их членов указана xml-документация, в основном только summary. Язык документации — русский.
Недостатки и отсутствующие возможности:
Общая документация. Пока даже не представляю, в каком виде её писать. (Кроме xmldoc-комментариев к классам, методам, и свойствам, которые уже есть.)
Обработка null. Пока такие свойства не сохраняются вовсе, и при десериализации, соответственно, оказываются пустыми, то есть null.
Поддержка кастомной сериализации. Пока отсутствует интерфейс ISerializable для собственной его реализации различными классами, но будет добавлен.
Поддержка сериализации иных системных типов и коллекций, помимо перечисленных выше. Будет добавляться по мере надобности.
Лицензия. Пока оно в закрытом виде в собственном svn-репозитарии, нужно ли делать открытым, не знаю.