java - 编译 protobuf 以使用原始类而不是众所周知的类型

标签 java protocol-buffers protoc proto3

假设我有 test.proto 文件:

syntax = "proto3";

option java_package = "testing";
option java_outer_classname = "Test_v1";

import "google/protobuf/wrappers.proto";

message TestMessage {
    .google.protobuf.Int32Value integerField = 1;
}

如果我将它编译(使用 protoc v3.5.0)为 c# 代码,我将获得可为 null 的类型属性:

public int? IntegerField {
   get { return integerField_; }
   set { integerField_ = value; }
 }

但是如果我将它编译成 Java 代码,字段将是众所周知的类型:

public Builder setIntegerField(com.google.protobuf.Int32Value value) {
  if (integerFieldBuilder_ == null) {
    if (value == null) {
      throw new NullPointerException();
    }
    integerField_ = value;
    onChanged();
  } else {
    integerFieldBuilder_.setMessage(value);
 }

我正在将项目从 proto2 移动到 proto3,所以我想避免使用众所周知的类型,因为更改相关代码需要大量工作。对于 C# 项目,我不需要修改任何内容,但在 Java 中,我需要按照以下示例进行修改:

TestMessage.Builder builder = TestMessage.newBuilder();
builder.setIntegerField(5); //<-- instead of this with proto2
builder.setIntegerField(Int32Value.newBuilder().setValue(5)); //<-- I will need to do something like this with proto3

有没有一种方法可以将 proto 文件编译为 Java,以便 setter 可以接受原始类/包装器(String、Integer 等)作为参数?

最佳答案

这里的问题是当值缺失时该怎么办。这不是 int32 的问题(在 .proto 中),作为(至少在 proto3 中)一个 int32将永远存在(默认为 0)。但是,.google.protobuf.Int32Value是一条消息,因此它可以缺失表示一个值(可能为 0) .在 C# 中,这个概念可以通过 int? 巧妙地表示。 (可以是 null ),但是 Java 没有类似于 Nullable<T> 的概念. Int32Value封装它,允许 null引用。

这么短的版本:不,(^^^) 这就是原因。

我假设您实际上是在替换以前的东西:

message TestMessage {
    optional int32 integerField = 1;
}

???

关于java - 编译 protobuf 以使用原始类而不是众所周知的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091597/

相关文章:

go - protobuf golang 从不同目录导入 .proto 和 .pb.proto

C++ Protobufs::如何使用 MergeFrom() 删除特定字段?

protocol-buffers - 如何从 protobuf 描述符获取方法选项?

java - 仅更改 application.property spring 中的一个属性

java - Websphere 7 错误 : A WSDL Definition could not be generated for the implementation class

java - 如何在tomcat中生成包级日志

c++ - 同一 C++ Linux 应用程序中的 Protocol Buffers 2 和 3

java - Jenkins 插件连接被拒绝

protocol-buffers - "Failed to parse input"来自 Google protocol buffers `` 的 protoc 命令 --decode_raw ``

android - 如何使用android studio protobuf插件编译protobuf消息实现Parcelable?