【问题标题】:protobuf-net extensions : "already contains a definition"protobuf-net 扩展:“已经包含定义”
【发布时间】:2014-10-05 16:12:08
【问题描述】:

我有以下(简化的!).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; }
}

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

显然,这不会编译。另外,Name="type" 对我来说似乎是错误的(不确定,可能没问题)。

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

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

  • 修改 .proto 并将“type”重命名为“type1”。这肯定会破坏一切。
  • 使用 protoc 处理二进制 .pb。减少了错误的数量,但仍然有很多错误。
  • 修补 protogen 使其生成像“Extension1_type”这样的字段名称
  • 使用“Extension1_type”等字段名称手动修补 .cs
  • 使用 protobuf-net 以外的其他东西

【问题讨论】:

    标签: protobuf-net


    【解决方案1】:

    选项:

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

    【讨论】:

    • 谢谢。我确实尝试编辑 .proto,但由于其他一些问题,我没有回答我自己的问题。感谢您确认这是一个有效的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多