我想了解为什么由Marc Gravell开发的协议缓冲解决方案的速度和它一样快.
我可以理解原始Google解决方案如何实现其性能:它预先生成用于对象序列化的优化代码; 我已经手工编写了一些序列化,并且知道如果避免反射,可以用这种方式编写相当快的代码.但Marc的库是一个运行时解决方案,它使用属性并且不会生成任何生成的代码.那么它是怎样工作的 ?
例如,我有原始文件File.proto:
enum Test {
ONE = 1;
TWO = 2;
}
Run Code Online (Sandbox Code Playgroud)
我File_pb2.py使用protoc 生成文件File.proto.我想在一个python代码中获取字符串"ONE"(对应于File_pb2.ONE的名称)的值为1(对应于File_pb2.ONE的值)来自生成的文件File_pb2.py而不定义我自己的字典.我怎样才能做到这一点?
我正在研究从数据库中获取数据并构造protobuff消息的东西.鉴于可以从数据库中为某些字段提取空值,我将在尝试构造protobuff消息时获得Null指针异常.从线程http://code.google.com/p/protobuf/issues/detail?id=57中的protobuffs中不支持知道null ,我想知道处理NPE的唯一其他方法是抛出是将手动检查插入到与原型相对应的java文件中,如下所示!
message ProtoPerson{
optional string firstName = 1;
optional string lastName = 2;
optional string address1 = 3;
}
ProtoPerson.Builder builder = ProtoPerson.Builder.newBuilder();
if (p.getFirstName() != null) builder.setFirstName(p.getFirstName());
if (p.getLastName() != null) builder.setLastName(p.getLastName());
if (p.getAddress1() != null) builder.setAddress1(p.getAddress1());
...
Run Code Online (Sandbox Code Playgroud)
那么有人可以澄清在protobuff构造期间是否还有其他可行的有效方法来处理空值?
我正在尝试使用Google的Protocol Buffers来描述RPC服务
service WhoamiService {
rpc WhoAreYou() returns (Whoami) {}
}
message Whoami {
optional bytes request_id = 1;
optional string hostname = 2;
optional string message = 3;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译这个定义时,我得到一个Expected type name指向该WhoAreYou()片段的错误.
它工作正常,如果我取代WhoAreYou()用WhoAreYou(Whoami),但在这种情况下,该方法不需要任何参数.是有办法做到这一点还是根本不支持?
有没有任何使用gRPC和Spring Boot的例子或想法的人?
我正在遵循本指南(https://developers.google.com/protocol-buffers/docs/pythontutorial)并使用addressbook.proto的确切示例.
发布编译器生成的addressbook_pb2.py文件的内容.当我运行以下简单程序时,有错误说,找不到google.protobuf,任何想法如何解决这个问题?谢谢.
顺便说一句,在Mac OSX上使用Python 2.7.
from addressbook_pb2 import Person
p = Person()
p.email = "abc"
print p.email
Run Code Online (Sandbox Code Playgroud)
这是自动生成的文件addressbook_pb2.py,
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: addressbook.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='addressbook.proto',
package='tutorial', …Run Code Online (Sandbox Code Playgroud) .NET协议缓冲区是否比Remoting(SerializationFormat.Binary)更轻/更快?是否会以语言/框架术语为其提供一流的支持?即它是否像Remoting/WebServices一样透明地处理?
协议缓冲区如何处理类型版本控制?
例如,当我需要随时间更改类型定义时?喜欢添加和删除字段.
我尝试使用import语句将名为test1.proto的proto文件导入另一个名为test2.proto的proto文件
import "com/test/test1.proto";
Run Code Online (Sandbox Code Playgroud)
但我得到以下错误
com/test/test1.proto: File not found.
test2.proto: Import "com/test/test1.proto" was not found or had errors.
Run Code Online (Sandbox Code Playgroud)
我试图在很多方面找到导入错误的原因,但不能.那么有人可以告诉我正确的方法进行原型文件导入,以防上述声明出现问题吗?
我想在我的protobuf用户消息示例中将UUID附加到字段.
message User {
// field containing id as UUID type
required string email;
optional string name;
}
Run Code Online (Sandbox Code Playgroud)
我知道protobuf消息还不支持UUID类型.我已经读过,最好的方法是使用UUID消息类型.
所以我猜我的用户消息将导入我的UUID消息原型定义并将其用作字段类型,如下所示:
import "myproject/UUID.proto";
message User {
required UUID id;
required string email;
optional string name;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,UUID消息将如何显示,以及如何对其进行编码/解码?我的目标是Java/Scala和C#兼容性.
protocol-buffers ×10
c# ×2
protobuf-net ×2
python ×2
.net ×1
grpc ×1
import ×1
java ×1
null ×1
protorpc ×1
python-2.7 ×1
reflection ×1
remoting ×1
spring ×1
spring-boot ×1
uuid ×1