Я оцениваю буферы протокола Google для службы на основе Java (но ожидаю языковых шаблонов). У меня есть два вопроса:
Первый общий вопрос:
Какие образцы мы видим, люди используют? Указанные шаблоны связаны с организацией класса (например, сообщения на файл .proto, упаковку и распространение) и определением сообщения (например, повторяющиеся поля и повторяющиеся инкапсулированные поля *) и т. Д.
Подобной информации очень мало на страницах справки Google Protobuf и в общедоступных блогах, в то время как существует масса информации для установленных протоколов, таких как XML.
У меня также есть конкретные вопросы по следующим двум различным схемам:
Представлять сообщения в файлах .proto, упаковывать их в отдельный jar-файл и отправлять его целевым пользователям сервиса, что, по-моему, является подходом по умолчанию.
Сделайте то же самое, но также включайте созданные вручную обертки (не подклассы!) Вокруг каждого сообщения, которое реализует контракт, поддерживающий, по крайней мере, эти два метода (T - класс обертки, V - класс сообщения (с использованием обобщений, но упрощенного синтаксиса для краткости) :
public V toProtobufMessage() { V.Builder builder = V.newBuilder(); for (Item item : getItemList()) { builder.addItem(item); } return builder.setAmountPayable(getAmountPayable()). setShippingAddress(getShippingAddress()). build(); } public static T fromProtobufMessage(V message_) { return new T(message_.getShippingAddress(), message_.getItemList(), message_.getAmountPayable()); }
Одно преимущество, которое я вижу с помощью (2), заключается в том, что я могу скрыть сложности, возникающие при V.newBuilder().addField().build()
добавлении, и добавить некоторые осмысленные методы, такие как isOpenForTrade()
или isAddressInFreeDeliveryZone()
другие, в свои оболочки. Второе преимущество, которое я вижу в (2), заключается в том, что мои клиенты имеют дело с неизменяемыми объектами (что я могу применить в классе-обертке).
Один недостаток, который я вижу в (2), заключается в том, что я дублирую код и должен синхронизировать мои классы-обертки с файлами .proto.
У кого-нибудь есть лучшие методы или дополнительная критика по любому из двух подходов?
* Под инкапсуляцией повторяющегося поля я имею в виду такие сообщения:
message ItemList {
repeated item = 1;
}
message CustomerInvoice {
required ShippingAddress address = 1;
required ItemList = 2;
required double amountPayable = 3;
}
вместо сообщений типа этого:
message CustomerInvoice {
required ShippingAddress address = 1;
repeated Item item = 2;
required double amountPayable = 3;
}
Мне нравится последнее, но я рад услышать аргументы против этого.