Подтвердить что ты не робот

Насколько быстрым или легким является протокол?

Будет ли Buffer протокола для .NET быть легким/быстрее, чем Remoting (SerializationFormat.Binary)? Будет ли поддержка первого класса для него в терминах языка/рамки? т.е. обрабатывается ли оно прозрачно, например, с помощью Remoting/WebServices?

4b9b3361

Ответ 1

Я очень сомневаюсь, что у него когда-либо будет прямая поддержка языка или даже поддержка фреймворка - это то, что прекрасно обрабатывается с сторонними библиотеками.

Мой собственный порт Java-кода - вы должны вызывать методы для сериализации/десериализации. (Есть RPC-заглушки, которые будут автоматически сериализоваться/десериализоваться, но пока не реализована RPC.)

Проект Марка Гравелла очень хорошо вписывается в WCF - насколько мне известно, вам просто нужно сказать (один раз) использовать буферы протокола для сериализации, а остальные - прозрачные.

С точки зрения скорости вы должны посмотреть страницу теста Марка Гравелла. Мой код, как правило, немного быстрее, чем его, но оба они намного быстрее, чем другие параметры сериализации/десериализации в рамках. Следует отметить, что протокольные буферы гораздо более ограничены - они не пытаются сериализовать произвольные типы, а только поддерживаемые. Мы будем пытаться поддерживать больше общих типов данных (десятичный, DateTime и т.д.) Переносимым способом (как свои собственные сообщения буфера протокола) в будущем.

Ответ 2

Некоторые показатели производительности и размера находятся на этой странице. На данный момент у меня нет статистики Джона, потому что страница немного старая (Джон: мы должны это исправить!).

Re является прозрачным; protobuf-net может подключаться к WCF через контракт; обратите внимание, что он отлично работает с MTOM поверх basic-http тоже. Однако это не работает с Silverlight, поскольку Silverlight не имеет точки впрыска. Если вы используете svcutil, вам также нужно добавить атрибут в класс (через частичный класс).

Re BinaryFormatter (удаленный); да, у этого есть полный supprt; вы можете сделать это просто с помощью тривиальной реализации ISerializable (т.е. просто вызвать метод Serializer с теми же аргументами). Если вы используете protogen для создания своих классов, то он может сделать это за вас: вы можете включить это в командной строке через аргументы (по умолчанию он не включен, поскольку BinaryFormatter не работает во всех фреймах [CF, и т.д.).

Обратите внимание, что для очень маленьких объектов (отдельных экземпляров и т.д.) при локальном удалении (IPC) производительность raw BinaryFormatter на самом деле лучше - но для нетривиальных графиков или удаленных ссылок (удаленное сетевое взаимодействие) protobuf-net может отключиться -формируйте это довольно хорошо.

Следует также отметить, что формат буферов протокольных буферов напрямую не поддерживает наследование; protobuf-net может обманывать это (сохраняя совместимость с проводом), но, как и в XmlSerializer, вам нужно объявить подклассы вверх.


Почему существуют две версии?

Я думаю, что радости открытого исходного кода, - мы с Джоном работали над совместными проектами раньше и обсуждали слияние этих двух, но дело в том, что они нацелены на два разных сценария:

  • dotnet-protobufs (Jon's) - это порт существующей версии java. Это означает, что у него есть очень знакомый API для любого, кто уже использует версию java, и он построен на типичных конструкциях java (классы-конструкторы, неизменные классы данных и т.д.) - с несколькими скручиваниями С#.
  • protobuf-net (Marc's) - это повторная реализация на основе нуля после того же двоичного формата (действительно, критическое требование состоит в том, что вы могут обмениваться данными между различными форматами), но используя типичные .NET-идиомы:
    • изменяемые классы данных (без сборщиков)
    • Спецификация члена сериализации выражается в атрибутах (сопоставимых с XmlSerializer, DataContractSerializer и т.д.)

Если вы работаете над java и .NET-клиентами, Jon, вероятно, является хорошим выбором для знакомого API с обеих сторон. Если вы чисты .NET, protobuf-net имеет преимущества - знакомый API.NET-стиля, но также:

  • вы не должны быть контрактными (хотя вы можете, и генератор кода поставляется)
  • вы можете повторно использовать существующие объекты (на самом деле классы [DataContract] и [XmlType] часто могут быть использованы без каких-либо изменений)
  • он полностью поддерживает наследование (которое он достигает на проводе путем инкапсуляции спуфинга) (возможно, уникальный для реализации буферов протоколов), обратите внимание, что подклассы должны быть объявлены заранее)
  • он не в состоянии подключиться и использовать основные инструменты .NET(BinaryFormatter, XmlSerializer, WCF, DataContractSerializer)), что позволяет работать непосредственно в качестве механизма удаленного взаимодействия. Вероятно, это будет довольно большой раскол от основного ствола java для порта Jon.

Повторное слияние; Я думаю, мы оба были бы открыты для этого, но вряд ли вам нужны оба набора функций, поскольку они нацелены на такие разные требования.