2013-02-10 34 views
5

我正在使用protobuf-net(版本2.0.0.621)並且有一個序列化List類型的問題,其中T是我自己的類(不管它包含什麼)和替代設置爲T.序列化列表<T>使用protobuf-net異常的代理

的代理設置是這樣的:

ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate)); 

MyClass的:

public class MyClass 
{ 
    public int Number { get; set; } 
} 

[ProtoContract] 
MyClassSurrogate 
{ 
    [ProtoMember(1)] 
    public int Number { get; set; } 
} 

然後,我創建MyClass類型插件的泛型列表,孟清湘,與項目填補它和序列化這樣的:

ProtoBuf.Serializer.Serialize(stream, list); 

在反序列化時出現問題,我不斷收到「空」,在代孕中所隱含的運營商轉換:

static public implicit operator MyClassSurrogate(MyClass myClass) 

然後「MyClass的' 一片空白。

如果我刪除代理項並使用proto屬性來裝飾MyClass,那麼一切正常。

你能告訴我我做錯了什麼嗎?

謝謝。

+0

忽略註釋如果無用,只是試圖幫助,但我從來沒有使用過協議緩衝區。無論如何,問題似乎很基本,這是否指向正確的方向? http://stackoverflow.com/questions/6498438/protobuf-net-cannot-serialize-type-data-how-can-i-define-type-data-with-protoc – bas 2013-02-10 09:32:25

回答

5

添加空校驗隱式轉換操作似乎解決這個問題,即:

public static implicit operator MyClassSurrogate(MyClass myClass) 
{ 
    return myClass != null ? new MyClassSurrogate { Number = myClass.Number } : null; 
} 

隱含的運營商最初與反序列化空值與出現被忽視的結果調用一次。

全面實施MyClassSurrogate的:

[ProtoContract] 
public class MyClassSurrogate 
{ 
    [ProtoMember(1)] 
    public int Number { get; set; } 

    public static implicit operator MyClassSurrogate(MyClass myClass) 
    { 
     return 
      myClass != null 
      ? new MyClassSurrogate { Number = myClass.Number } 
      : null; 
    } 

    public static implicit operator MyClass(MyClassSurrogate myClass) 
    { 
     return new MyClass { Number = myClass.Number }; 
    } 
} 

完整序列化/反序列化例如:

var model = ProtoBuf.Meta.RuntimeTypeModel.Default; 
model.Add(typeof(MyClassSurrogate), true); 
model.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate)); 
var stream = new System.IO.MemoryStream(); 
var list = new List<MyClass>(); 
for (int x = 0; x < 10; x++) list.Add(new MyClass { Number = x });    
ProtoBuf.Serializer.Serialize(stream, list); 
stream.Seek(0, SeekOrigin.Begin); 
var xs = ProtoBuf.Serializer.Deserialize<List<MyClass>>(stream); 
foreach (var x in xs) Debug.WriteLine(x.Number); 
1

null值使用相當經常,包括反序列化過程。您應該能夠解決這個問題簡單地告訴轉換操作符來翻譯null作爲空:

if(value == null) return null; 

關於它的思考,我也許可以安全地添加了「如果兩個是引用類型,自動轉化爲null空」。