Судя по комментариям, сценарий ОП требует сильной совместимости с будущими версиями приложения/.NET, и в этом случае я всегда советую против BinaryFormatter
— у него много «фич», которые просто плохо работают между версиями (и уж точно не между платформами).
Я рекомендую смотреть сериализаторы на основе контрактов; Я предвзят, но склоняюсь к protobuf-net (что соответствует спецификации protobuf от Google). Самый простой способ сделать это — атрибутировать типы таким образом, чтобы библиотека могла легко с ними работать (хотя это можно сделать и без атрибутов), например:
[ProtoContract]
public class Customer {
[ProtoMember(1)]
public List<Order> Orders {get {....}}
[ProtoMember(2)]
public string Name {get;set;}
... etc
}
(подход к атрибуту очень знаком, если вы выполняли какую-либо работу с XmlSerializer или DataContractSerializer - и действительно, protobuf-net может использовать атрибуты из них, если вы не хотите добавлять специфические атрибуты protobuf-net)
затем что-то вроде:
Customer cust = ...
byte[] data;
using(var ms = new MemoryStream()) {
Serializer.Serialize(ms, cust);
data = ms.ToArray();
}
Данные, созданные таким образом, не зависят от платформы и могут быть загружены в любой соответствующий контракт (они даже не должны быть Customer
— они могут быть любого типа с соответствующим макетом через атрибуты). Действительно, в большинстве случаев он легко загружается в любую другую реализацию protobuf — Java, C++ и т. д.
person
Marc Gravell
schedule
16.09.2011