protobuf-net扩展:"已经包含一个定义"

时间:2014-10-03 10:44:13

标签: protobuf-net

我有以下(简化!)。proto。它来自另一个软件,我无法修改它

package test;

message Base
{
    optional string name            = 2;
    extensions 1000 to max;
}

message Extension1 {
  extend Base {
    optional Extension1 type = 1000;
  }
  optional double     blabla      = 2;
}

message Extension2
{
  extend Base {
    optional Extension2 type = 1001;
  }
  optional double     blabla      = 2;
}

编译是否使用protogen为Base消息(提取)生成以下C#:

private test.Extension1 _type = null;
[global::ProtoBuf.ProtoMember(1000, IsRequired = false, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue(null)]
public test.Extension1 type
{
  get { return _type; }
  set { _type = value; }
}

private test.Extension2 _type = null;
[global::ProtoBuf.ProtoMember(1001, IsRequired = false, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue(null)]
public test.Extension2 type
{
  get { return _type; }
  set { _type = value; }
}

正如您所看到的,扩展名都称为“类型”,但应该称为“Extension1 :: type”和“Extension2 :: type”(如果我对extensions的理解是正确的话)。

显然,这不会编译。另外,Name = @“type”对我来说似乎不对(不确定,可能没问题)。

如何才能阅读使用此.proto序列化的文件?

我想到的可能的解决方法:

  • 修改.proto并将“type”重命名为“type1”。这肯定会打破一切。
  • 使用protoc通过二进制.pb。减少错误的数量,但仍有许多错误。
  • 修补protogen,使其生成字段名称,如“Extension1_type”
  • 使用“Extension1_type”
  • 等字段名称手动修补.cs
  • 使用除protobuf-net之外的其他内容

1 个答案:

答案 0 :(得分:1)

选项:

  • 尝试protobuf-csharp-port,它更接近谷歌代码库,可能会更好地处理这种情况
  • 编辑生成的C#文件以重命名其中一个成员:名称从不以二进制格式使用,因此只要数字相同,名称​​无关紧要
  • 编辑.proto文件:出于同样的原因,如果您只是复制文件,编辑副本中的名称,并从副本生成代码,则不会发生任何不良行为