【发布时间】: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