2011-07-31 32 views
7

(注意:T是一些ProtoContract/ProtoMembered類的字典正常工作。)這個問題只發生在使用類型對象的我。在ProtoBuf-net中序列化字典<字符串,對象>失敗

我試圖序列化字典工作的字典。

typeof(object)不起作用。應該是?我應該實施一個基於字符串的工作嗎?

在這種情況下,對象將永遠只是一個.net原語。

[Test] 
    public void De_SerializeObjectDictionary2() 
    { 
     var d = new Dictionary<string, object>(); 

     d.Add("abc", 12); 

     var ms = new MemoryStream(); 

     var model = ProtoBuf.Meta.RuntimeTypeModel.Default; 
     //model.AutoAddMissingTypes = true; 
     //model.AutoCompile = true; 
     //model.InferTagFromNameDefault = true; 
     //model.Add(typeof (object), false); 
     //model.Add(typeof(Int32), true); 
     //model[typeof (object)].AddSubType(50, typeof (Int32)); 

     model.Serialize(ms, d); 
     Serializer.Serialize<Dictionary<string,object>>(ms, d); 
     // <--- No serializer defined for type: System.Object 

     // or 
     //model.Add(typeof (object), false); 
     //Serializer.Serialize<Dictionary<string, object>>(ms, d); 
     //<-- Unexpected sub-type: System.Int32 
     ms.Position = 0; 

     var d2 = Serializer.Deserialize<Dictionary<string, object>>(ms); 
    } 

我試圖預先定義這些類型的...但我認爲他們在默認情況下,通過protobuf網

 //model.Add(typeof (object), false); 
     //model[typeof (object)].AddSubType(50, typeof (Int32)); 
     /* 
     //model.Add(typeof(int), false); 
     //model.Add(typeof(string), false); 
     //model.Add(typeof(short), false); 
     //model.Add(typeof(DateTime), false); 
     //model.Add(typeof(long), false); 
     //model.Add(typeof(bool), false); 
     //model.Add(typeof(int[]), false); 
     //model.Add(typeof(string[]), false); 
     //model.Add(typeof(short[]), false); 
     //model.Add(typeof(DateTime[]), false); 
     //model.Add(typeof(long[]), false); 
     //model.Add(typeof(bool[]), false); 

     //model.Add(typeof(int?), false); 
     //model.Add(typeof(short?), false); 
     //model.Add(typeof(DateTime?), false); 
     //model.Add(typeof(long?), false); 
     //model.Add(typeof(bool?), false); 
     //model.Add(typeof(int?[]), false); 
     //model.Add(typeof(short?[]), false); 
     //model.Add(typeof(DateTime?[]), false); 
     //model.Add(typeof(long?[]), false); 
     //model.Add(typeof(bool?[]), false); 

     //model.Add(typeof(byte[]), false); 
     //model.Add(typeof(byte), false); 
+0

你知道所有可能的類型嗎?這裏有幾種類型? –

+0

是字典中可串行化的所有類型? –

+0

是的。這是我嘗試的主要原因。他們都造成錯誤。我認爲他們已經被Protobuf-net庫定義了。 – sgtz

回答

4

做到這一點直接早已慾望處理已被提出,並在我的列表中查看,但:作爲繼承的一部分,使用內置序列化(int等)處理類型具有一些技術問題,這些問題不是很有趣。我的建議是使用抽象基類與通用的具體實現,並在基類型上使用「include」屬性來引用運行時的每個預期類型 - Foo<int>,Foo<string>等DynamicType在這裏也是一個考慮因素,但沒有一些小的調整,我認爲這不會立即用於字典。它可以做,但是。

+0

+1 ty。是。這將工作正常。感謝您的建議。 – sgtz

相關問題