2010-09-08 112 views
2

我剛剛從r249更新至r282。除了替換DLL我沒有做任何改變。不幸的是,現在反序列化更新之前創建的對象需要更長的時間。過去需要兩秒鐘的時間現在需要五分鐘。Protobuf網r282有問題反序列化對象與r249序列化

版本之間是否存在語法更改?有什麼它不再支持?

我的類都使用ProtoContract,ProtoMember和ProtoInclude。我正在運行VS2010。就我而言,我的協議緩衝區代碼沒有問題。我只是想升級,因爲我覺得最好有最新版本。

編輯 - 2010.09.09 我的對象的屬性之一是一個ushorts數組。我剛剛注意到這個屬性並沒有使用r282正確序列化/反序列化。數組的結果值全爲零。數組在序列化(r282)之前有值,但不是在反序列化(r282)之後。

+0

有關詳細信息,請參見[相關博客條目](http://marcgravell.blogspot.com/2010/09/protobuf-net-ushort-glitch-before-r274.html) – 2010-09-20 06:33:08

回答

2

事實證明,儘管我的努力,是的,在早期的版本之一,數據格式發生了突變。這隻影響ushort數據,在處理時忽略了這一點。這是令人遺憾的,但好消息是,沒有數據是丟失 - 這只是有點不方便訪問(它本質上是寫在一個字符串)。

這是我建議的解決方法;像一個成員:

[ProtoBuf.ProtoMember(1)] 
public ushort[] Data {get;set;} 

替換有:

[ProtoBuf.ProtoMember(1)] 
private string[] LegacyData {get;set;} 

private bool LegacyDataSpecified { get { return false; } set { } } 

/* where 42 is just an unused new field number */ 
[ProtoBuf.ProtoMember(42, Options = MemberSerializationOptions.Packed)] 
public ushort[] Data { get; set; } 

[ProtoBuf.ProtoAfterDeserialization] 
private void SerializationCallback() 
{ 
    if (LegacyData != null && LegacyData.Length > 0) 
    { 
     ushort[] parsed = Array.ConvertAll<string, ushort>(
      LegacyData, ushort.Parse); 
     if (Data != null && Data.Length > 0) 
     { 
      int oldLen = parsed.Length; 
      Array.Resize(ref parsed, parsed.Length + Data.Length); 
      Array.Copy(Data, 0, parsed, oldLen, Data.Length); 
     } 
     Data = parsed; 
    } 
    LegacyData = null; 
} 

該進口舊式數據到LegacyData和期間(後)序列化將其合併,或寫入新型數據從Data。更快,更小,同時支持新舊數據。

+0

請閱讀原文的補充內容帖子。 – 2010-09-09 18:47:29

+0

@丹 - 好的,這有幫助。我今天即將入場,但明天將進行調查。很奇怪! – 2010-09-09 20:49:34

+0

這有什麼更新? – 2010-09-16 18:27:29