Ren*_*iuz 5 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# 代码,我将获得可为空的类型属性:
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 接受原始类/包装器(字符串、整数等)作为参数?
这里的问题是当值丢失时该怎么办。这对于(在 .proto 中)来说不是问题int32,因为(至少在 proto3 中) anint32总是存在(默认为 0)。然而, an.google.protobuf.Int32Value是一条消息,因此它可能会丢失,或者代表一个值(可能是 0)。int?在C#中这个概念可以通过(可以是)来整齐地表示null,但是Java没有类似的概念Nullable<T>。对此进行了封装Int32Value,以供null参考。
那么简短的版本:不,(^^^)这就是原因。
我假设你实际上正在替换以前的东西:
message TestMessage {
    optional int32 integerField = 1;
}
???
| 归档时间: | 
 | 
| 查看次数: | 3370 次 | 
| 最近记录: |