编译 protobuf 以使用原始 类 而不是众所周知的类型
Compile protobuf to use primitive classes instead of well-known types
假设我有 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 接受原始 classes/wrappers(字符串、整数等)作为参数?
这里的问题是当值丢失时该怎么办。这不是 int32
(在 .proto 中)的问题,因为(至少在 proto3 中)int32
将始终存在(默认为 0)。但是,.google.protobuf.Int32Value
是 消息 ,因此它可能 缺失 、 or 表示一个值(可能为 0)。在 C# 中,这个概念可以通过 int?
(可以是 null
)巧妙地表示,但是 Java 没有类似于 Nullable<T>
的概念。 Int32Value
对此进行封装,允许 null
引用。
这么短的版本:没有,(^^^) 这就是原因。
我假设你实际上是在替换以前的东西:
message TestMessage {
optional int32 integerField = 1;
}
???
假设我有 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 接受原始 classes/wrappers(字符串、整数等)作为参数?
这里的问题是当值丢失时该怎么办。这不是 int32
(在 .proto 中)的问题,因为(至少在 proto3 中)int32
将始终存在(默认为 0)。但是,.google.protobuf.Int32Value
是 消息 ,因此它可能 缺失 、 or 表示一个值(可能为 0)。在 C# 中,这个概念可以通过 int?
(可以是 null
)巧妙地表示,但是 Java 没有类似于 Nullable<T>
的概念。 Int32Value
对此进行封装,允许 null
引用。
这么短的版本:没有,(^^^) 这就是原因。
我假设你实际上是在替换以前的东西:
message TestMessage {
optional int32 integerField = 1;
}
???