2013-06-19 51 views
14

我有一個與DataContracts的程序集,我需要生成.proto模式才能夠與java系統交換數據。 DataContracts代碼可以更改,但不能在其中添加[ProtoContract][ProtoMember]屬性,因爲它會導致protobuf-net程序集依賴性。我們在系統的C#部分中使用WCF,所以我們不希望在大多數不支持Java系統的C#項目中依賴於proto-buf程序集。protobuf-net沒有屬性的序列化

在protobuf網網站在GettingStarted部分它說:

不喜歡的屬性?
在v2中,可以通過RuntimeTypeModel在運行時配置屬性的所有內容。

但我不知道如何實際配置沒有屬性的序列化,我沒有看到任何這樣的例子。

我試圖做

[DataContract] 
public class MyEntity 
{ 
    [DataMember(Order = 1)] 
    public String PropertyA { get; set; } 

    [DataMember(Order = 2)] 
    public int PropertyB { get; set; } 
} 

RuntimeTypeModel.Default.Add(typeof(MyEntity), false); 

string proto = Serializer.GetProto<MyEntity>(); 

,並獲得以下爲proto

package ProtobufTest; 

message MyEntity { 
} 

回答

12

澄清的價值:最該答案涉及預編輯的問題,其中false是傳遞到RuntimeTypeModel.Add(...)


我已經使用了您的通氣T代碼(我推斷,這是namespace ProtobufTest,但其餘的全是複製/粘貼從問題)與r2.0.0.640(當前的NuGet部署),我也得到:

package ProtobufTest; 

message MyEntity { 
    optional string PropertyA = 1; 
    optional int32 PropertyB = 2 [default = 0]; 
} 

另外,您得到確切即使您刪除RuntimeTypeModel.Default.Add(...)行相同的結果。

這是我不清楚爲什麼你看到不同的東西 - 你能澄清:

  • 您使用這protobuf網版完全相同
  • 如果這些[DataContract]/[DataMember]屬性是System.Runtime.Serialization.dll者,或你自己的(對不起,如果這似乎是一個奇怪的問題)

要充分回答這個問題:如果你不能有任何屬性(一第二你也蠻好的那些),你也可以這樣做:

RuntimeTypeModel.Default.Add(typeof(MyEntity), false) 
    .Add(1, "PropertyA") 
    .Add(2, "PropertyB"); 

這將配置PropertyA關鍵1,和PropertyB關鍵2.

+0

感謝快速反應!我使用相同的版本。我的'RuntimeTypeModel.Default.Add(typeof(MyEntity),...)'中的第二個參數實際上是'false'。有了「真」或根本沒有這個電話,我就可以得到和你一樣的結果。 – Mike

+0

@Mike啊,對;是的,「false」意味着「不看屬性」,其中包括不看「DataMember(Order = n)」屬性。如果你通過'false',你需要手動配置* - 這就是我在上面的例子中所做的。如果您想使用'DataMember(Order = n)'屬性:說'真' –

+0

順便說一句,最好讓這些'.Add(1,「PropertyA」)'部件接受Expression作爲第二個強類型和編譯器檢查的參數:)這將減輕非屬性類型的工作量。 – Mike

相關問題