【发布时间】:2017-08-30 04:27:53
【问题描述】:
在 GRPC 客户端的examples 中有两种实现,一种是在运行时加载和处理.proto 文件,另一种是使用protoc 编译它们。
我的问题是:有什么区别?文档只说“它们的行为相同”,但肯定有区别吧?
【问题讨论】:
在 GRPC 客户端的examples 中有两种实现,一种是在运行时加载和处理.proto 文件,另一种是使用protoc 编译它们。
我的问题是:有什么区别?文档只说“它们的行为相同”,但肯定有区别吧?
【问题讨论】:
从根本上说,主要区别在于您提到的那个:使用动态代码生成,.proto 文件在运行时加载和解析,而使用静态代码生成,.proto 文件被预处理为 JavaScript。
动态代码生成更易于使用,可能更易于调试,并生成接受常规 JavaScript 对象的代码。
静态代码生成(使用 protoc)需要用户创建 protobuf 对象,这意味着将更早地完成输入验证。也是与其他语言更加一致的工作流程。
【讨论】:
.proto 文件放到grpc 库中并完成它,为什么还要经历这么多麻烦呢?我还注意到在使用静态代码时必须使用生成的 getter 和 setter,这使得使用起来有点麻烦,所以我明白为什么动态代码会更容易。
last_name 的字段,而您的客户将其输入错误为lastName。如果使用静态生成,那么在请求发送到服务器之前就会检测到这个错误,因为代码知道lastName 是一个不存在的字段。相反,如果使用动态代码生成,则此类错误可能会导致静默失败。也就是说,last_name 将保留为其默认值。