2016-01-20 5 views
0

Почему протокольные буферы намного лучше, чем бинарная сериализация .NET? Я могу только найти сравнения, которые говорят о том, насколько это лучше (с точки зрения производительности и размера), но я не мог найти почему. Можно ли хотя бы частично объяснить это, не вдаваясь в подробности?Почему протокольные буферы намного лучше, чем бинарная сериализация .NET?

ответ

2

Поскольку BinaryFormatter хранит информацию о типе и свойствах в сериализованных данных, он больше, следовательно, относительно медленнее.

ProtoBuf переносит это на сторону приложения, поэтому как сериализатор, так и десериализатор должны точно знать, что они делают, и указать в коде, который тип и какие свойства они хотят десериализовать.

1

Важнейшей причиной является то, что двоичная сериализация (BinaryFormatter) является хрупкой. Он кодирует точные имена типов и т. Д., Что делает его бесполезным для архивирования данных, например, в формате документа для приложения.

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

Если у вас нет каких-либо проблем с производительностью (т.е. сообщения невелики), и вы только хотите, чтобы временно хранить или передавать некоторое сгусток данных, то он может быть полезным. Например, для передачи небольших сообщений между двумя экземплярами настольного приложения на одном компьютере это может быть полезно, так как вам не нужно добавлять другую библиотеку только для этой задачи.

+0

Я бы не назвал это хрупким, но жестким. Для того, чтобы десериализовать сериализованный объект, вы можете использовать тот же самый тип, который можно считать хорошим. Это не так печально, как и другие формы сериализации, где байты или целые поля могут оказаться не в том месте, потому что вы используете несовместимый тип, «но эй, он десериализуется, не жалуясь!». – CodeCaster

+0

Хорошо можно назвать это жестким. Проблема в том, что чрезвычайно жесткая схема полностью скрыта, поэтому ее очень легко сломать. например путем написания пространства имен по-разному. Эта хрупкость хороша, если вы хотите передавать сообщения между двумя экземплярами приложения (разные версии тогда не могут общаться), но не совсем идеально, если вы делаете формат документа в текстовом редакторе ... –

+0

Итак, это явное: весь тип, используемый для сериализации, включая его пространство имен, требуется для успешной десериализации. Вам нужно явно загрузить тот же самый тип, для вас ничего не подразумевается. Опять же, в зависимости от контекста, это может быть или не быть тем, что вы хотите. В любом случае, типы сериализации версий - сложный вопрос. Я не могу представить себе нетекстовый сериализатор, который позволяет, например, вставлять произвольные поля в середине сообщения. С более неявной сериализацией, например, полями фиксированной длины, это _will_ беспорядок десериализации. – CodeCaster

Смежные вопросы