2014-10-03 77 views
1

我有以下(簡化!).proto。它來自另一個軟件,我不能修改它protobuf-net擴展:「已包含定義」

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; 
} 

如果與硫辛酸編譯生成用於基站消息下面的C#(提取物):

private test.Extension1 _type = null; 
[global::ProtoBuf.ProtoMember(1000, IsRequired = false, [email protected]"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, [email protected]"type", DataFormat = global::ProtoBuf.DataFormat.Default)] 
[global::System.ComponentModel.DefaultValue(null)] 
public test.Extension2 type 
{ 
    get { return _type; } 
    set { _type = value; } 
} 

正如你可以看到,延伸部都被稱爲「類型」,而應被稱爲「擴展1 :: type「和」Extension2 :: type「(如果我對extensions的理解是正確的)。

顯然,這不會編譯。此外,名稱= @「類型」似乎對我來說是錯誤的(不知道,也許沒關係)。

我能做些什麼來讀取使用這個.proto序列化的文件?我想過的

可能的解決方法:

  • 修改.proto和重命名 「類型」 爲 「TYPE1」。這一定會打破一切。
  • 使用protoc瀏覽二進制.pb。減少錯誤的數量,但許多仍然存在。
  • 修補硫辛酸,使其產生像「Extension1_type」
  • 手工修補包含「Extension1_type」字段名的.cs
  • 比使用protobuf網

回答

1

選擇別的字段名稱:

  • 試的protobuf-CSHARP口,這是更接近谷歌的代碼庫,並且可能處理這種情況更好
  • 編輯生成的C#文件重命名其中一個成員:名稱從不使用二進制格式,所以只要數字相同,名稱並不重要
  • 編輯.proto文件:出於同樣的原因以上,如果您只是簡單地複製文件,編輯副本中的名稱,並從副本生成代碼,那麼沒有什麼不好的情況會發生。
+0

謝謝。我的確嘗試編輯.proto,但由於其他問題,我沒有回答自己的問題。感謝您確認這是一種有效的解決方法。 – Calvin1602 2014-10-06 09:28:43

相關問題