2009-11-25 5 views
14

Мы вводим буферы протокола в качестве нового транспорта для некоторых RPC-сервисов. Поскольку есть сопротивление ручному перемещению данных между различными типами похожих объектов, я могу предвидеть, что экземпляры Buffer протокола передаются в стек немного выше, чем только для интерфейса сервера RPC.Использование буфера протокола в качестве общего объекта данных?

Это что-то, чего я должен стараться избегать? Безопасно ли обрабатывать объект буфера протокола, например, простой держатель данных, с удобным удобством, чтобы он мог быстро и эффективно преобразовываться в двоичный файл и из него?

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

ответ

9

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

Это безопасно, чтобы сделать это, но это не всегда создает самые красивые конструкции. С другой стороны, иногда это именно то, что доктор заказал :)

Я предлагаю вам экспериментировать - здесь нет «одного размера подходит всем».

+0

Я думаю, что факт, что они неизменяемы, фактически помогает, а не болит, когда дело доходит до использования буферов протокола, подобных этому. Они являются неизменяемыми объектами ценности, такими как String. –

+0

Это, безусловно, помогает в некоторых случаях, когда вы можете писать код в функциональном стиле. Отчасти это зависит от проблемы, а отчасти и от разработчиков :) –

+0

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

0

В целом, я проектирую слои своих систем, так что детали реализации из одного слоя не просачиваются друг в друга. У меня нет прямого опыта использования протокольных буферов Google, но похоже, что вы хотите использовать одно и то же представление для транспорта и на более высоких уровнях вашей системы.

Если вы решили прекратить использование протокольных буферов в качестве транспортного представления, насколько легко было бы использовать что-то еще?

+0

Это на самом деле шаг в направлении именно этого. В настоящий момент набор интерфейсов диктует наш уровень данных, back end RPC * и *, чтобы расширить уровень веб-сервиса RESTful. * PAIN *. Шаг №1 - заменить задний конец буферами протоколов, чтобы отделить его от остальных. Но это отличный момент. Если я просто переключу все на protobufs, единственное, что я отключил, это связь между клиентом и службами RPC, а все остальные слои будут зависеть от объектов Message ... BAD. –