Bartosz, хотя этот вопрос довольно старый, я мог бы порекомендовать вам и всем, кто сталкивается с ним, использовать Migrant , доступный как из источника, так и из пакета NuGet .Я один из соавторов.
Это может быть легко адаптировано даже к сложным сценариям, мы постарались сделать его максимально простым в использовании.
Размер вывода достаточно мал,Конечно, это зависит от вашего дерева объектов, но может быть сравнимо с protobuf-net.Как и protobuf, он использует кодировку Varint и ZigZag.
Конечно, Migrant решает проблемы, о которых вы упомянули - он хранит целые графики объектов, обрабатывает наследование, сложные коллекции, допустимость версий (до некоторой степени) и т. Д.
В терминахПо скорости мы стараемся быть сравнимыми с protobuf-net.Он поддерживает де-сериализацию с использованием динамически генерируемых методов, что намного быстрее, чем классические решения, основанные на отражениях.
Простые сценарии использования доступны на сайте, на который я ссылаюсь, но простое клонирование объектов не вызывает затруднений.
var myComplexObject = new MyComplexType(complexParameters);
var myObjectCopy = serializer.DeepClone(myComplexObject);
Запись в поток так же проста.
Конечно, для очень сложных типов существует набор декораторов классов (атрибутов, хуков), которые делают вещи еще умнее ;-)