Некоторые показатели производительности и размера указаны на этой странице . В данный момент у меня нет статистики Джона, просто потому что страница немного устарела (Джон: мы должны это исправить!).
Ре быть прозрачным; protobuf-net может подключиться к WCF через контракт; обратите внимание, что он хорошо работает с MTOM, а не с Basic-http. Это не работает с Silverlight, так как Silverlight не хватает точки впрыска. Если вы используете svcutil, вам также нужно добавить атрибут в класс (через частичный класс).
Re BinaryFormatter (удаленное взаимодействие); да, это имеет полную поддержку; Вы можете сделать это просто с помощью тривиальной реализации ISerializable
(т.е. просто вызовите метод Serializer
с теми же аргументами). Если вы используете protogen
для создания ваших классов, то он может сделать это за вас: вы можете включить это в командной строке с помощью аргументов (по умолчанию это не включено, поскольку BinaryFormatter
не работает на всех платформах [CF] и т. д.)).
Обратите внимание, что для очень маленьких объектов (единичных экземпляров и т. Д.) При локальном удаленном взаимодействии (IPC) производительность BinaryFormatter
на самом деле лучше, но для нетривиальных графов или удаленных ссылок (удаленное взаимодействие по сети) protobuf-net может выйти -производите это очень хорошо.
Следует также отметить, что формат проводов буферов протокола напрямую не поддерживает наследование; Protobuf-net может подделать это (сохраняя совместимость проводов), но, как и в случае с XmlSerializer, вам необходимо объявить подклассы заранее.
Почему есть две версии?
Радости открытого исходного кода, я думаю ;-p Джон и я работали над совместными проектами и обсуждали слияние этих двух, но дело в том, что они нацелены на два разных сценария:
- dotnet-protobufs (Jon's) - это порт существующей версии Java. Это означает, что у него есть очень знакомый API для тех, кто уже использует java-версию, и он построен на типичных Java-конструкциях (классах компоновщика, неизменных классах данных и т. Д.) - с небольшими изменениями в C #.
- protobuf-net (Марк) - это повторная реализация, основанная на том же двоичном формате (действительно, критическое требование заключается в том, что вы можете обмениваться данными между различными форматами), но с использованием типичного .NET идиомы:
- изменяемые классы данных (без компоновщиков)
- спецификация члена сериализации выражается в атрибутах (сравнимых с
XmlSerializer
, DataContractSerializer
и т. Д.)
Если вы работаете на клиентах java и .NET, Jon's, вероятно, является хорошим выбором для знакомого API с обеих сторон. Если вы чистый .NET, у protobuf-net есть свои преимущества - знакомый API в стиле .NET, но также:
- вы не вынуждены быть первым по контракту (хотя вы можете, и генератор кода поставляется)
- вы можете повторно использовать существующие объекты (на самом деле классы
[DataContract]
и [XmlType]
часто могут использоваться без каких-либо изменений)
- он имеет полную поддержку наследования (которое достигается на проводе путем подмены инкапсуляции) (возможно, уникальное для реализации буферов протокола? Обратите внимание, что подклассы должны быть объявлены заранее)
- он старается изо всех сил подключать и использовать основные инструменты .NET (
BinaryFormatter
, XmlSerializer
, WCF, DataContractSerializer
) - позволяя ему работать непосредственно как удаленный механизм. Предположительно, это будет довольно большой отрыв от основного ствола Java для порта Джона.
Повторное слияние их; Я думаю, что мы оба были бы открыты для этого, но маловероятно, что вы захотите оба набора функций, поскольку они нацелены на такие разные требования.