Почему протокольные буферы намного лучше, чем бинарная сериализация .NET? Я могу только найти сравнения, которые говорят о том, насколько это лучше (с точки зрения производительности и размера), но я не мог найти почему. Можно ли хотя бы частично объяснить это, не вдаваясь в подробности?Почему протокольные буферы намного лучше, чем бинарная сериализация .NET?
ответ
Поскольку BinaryFormatter хранит информацию о типе и свойствах в сериализованных данных, он больше, следовательно, относительно медленнее.
ProtoBuf переносит это на сторону приложения, поэтому как сериализатор, так и десериализатор должны точно знать, что они делают, и указать в коде, который тип и какие свойства они хотят десериализовать.
Важнейшей причиной является то, что двоичная сериализация (BinaryFormatter) является хрупкой. Он кодирует точные имена типов и т. Д., Что делает его бесполезным для архивирования данных, например, в формате документа для приложения.
Другие причины включают в себя производительность, доступность платформы и т.д.
Если у вас нет каких-либо проблем с производительностью (т.е. сообщения невелики), и вы только хотите, чтобы временно хранить или передавать некоторое сгусток данных, то он может быть полезным. Например, для передачи небольших сообщений между двумя экземплярами настольного приложения на одном компьютере это может быть полезно, так как вам не нужно добавлять другую библиотеку только для этой задачи.
- 1. Android и протокольные буферы
- 2. Почему ChromeDriver работает намного лучше, чем PhantomJSDriver
- 3. Невозможно скомпилировать протокольные буферы 3.1.0
- 4. . Бинарная сериализация .NET в QuickGraph 3.6
- 5. - это протокольные буферы, подходящие для долгосрочной сериализации?
- 6. протокольные буферы + zlib = неразрешенный внешний символ
- 7. Буфер протокола лучше, чем сериализация?
- 8. Протокольные буферы не генерируют служебные заглушки
- 9. Поддерживает ли protobuf (протокольные буферы) пользовательские типы?
- 10. Можно использовать протокольные буферы с перекрестным языком
- 11. Могут ли протокольные буферы сериализовать hash_multimap?
- 12. протокольные буферы - генерировать NON-inline-аксессоры
- 13. Почему File.Open намного лучше, чем File.Create для перезаписи существующего файла?
- 14. .NET бинарная сериализация между 32-разрядной и 64-разрядной ОС
- 15. protobuf-net НЕ быстрее, чем двоичная сериализация?
- 16. протокольные буферы и фактические параметры транспорта - сокеты или промежуточное ПО
- 17. Будут ли протокольные буферы Google автоматически выравнивать данные?
- 18. Почему двоичная сериализация быстрее, чем сериализация XML?
- 19. Бинарная совместимость интерфейсов .Net
- 20. Почему `` `` лучше, чем `подмножество`?
- 21. Почему Path.Combine лучше, чем «\\»?
- 22. . Протокольные буферы .Net для класса JSON, JsonFormatReader не обрабатывают крайние фигурные скобки.
- 23. Понимание C# generics намного лучше
- 24. Бинарная сериализация ObservableCollection и передача по сети
- 25. протокольные буферы с клиентом C++ и C# back-end?
- 26. протокольные буферы: нет обозначений для буферов фиксированного размера?
- 27. как отправлять классы, определенные в .proto (протокольные буферы) через сокет
- 28. Действительно ли протокольные буферы повторно используют указатель строки при разборе?
- 29. Могут ли протокольные буферы использоваться для реализации стороннего протокола
- 30. Пример использования, где Lua подходит намного лучше, чем C/C++
Я бы не назвал это хрупким, но жестким. Для того, чтобы десериализовать сериализованный объект, вы можете использовать тот же самый тип, который можно считать хорошим. Это не так печально, как и другие формы сериализации, где байты или целые поля могут оказаться не в том месте, потому что вы используете несовместимый тип, «но эй, он десериализуется, не жалуясь!». – CodeCaster
Хорошо можно назвать это жестким. Проблема в том, что чрезвычайно жесткая схема полностью скрыта, поэтому ее очень легко сломать. например путем написания пространства имен по-разному. Эта хрупкость хороша, если вы хотите передавать сообщения между двумя экземплярами приложения (разные версии тогда не могут общаться), но не совсем идеально, если вы делаете формат документа в текстовом редакторе ... –
Итак, это явное: весь тип, используемый для сериализации, включая его пространство имен, требуется для успешной десериализации. Вам нужно явно загрузить тот же самый тип, для вас ничего не подразумевается. Опять же, в зависимости от контекста, это может быть или не быть тем, что вы хотите. В любом случае, типы сериализации версий - сложный вопрос. Я не могу представить себе нетекстовый сериализатор, который позволяет, например, вставлять произвольные поля в середине сообщения. С более неявной сериализацией, например, полями фиксированной длины, это _will_ беспорядок десериализации. – CodeCaster