2011-07-31 24 views
7

(NOT: T'nin bazı Protokolü/ProtoMembered sınıfının düzgün çalıştığı sözlük.) Bu sorun, yalnızca tip nesnesinde benim için oldu.ProtoBuf-net dosyasındaki bir Dictionary <string, object> serileştirmesi

Sözlük çalışmasının bir sözlüğünü serileştirmeye çalışıyordum. Typeof (object) çalışmıyor. Olmalı mı? Dize merkezli bir çalışma yapmalı mıyım?

Bu senaryoda, nesne yalnızca bir ilkel ilke olacaktır.

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

vaktinden bu tür oluşturulmaya çalışılmış ... ama onlar protobuf-net

 //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

Tüm olası türleri biliyor musunuz? Burada kaç tip var? –

+0

, serileştirilebilir sözlükteki tüm türlerdir? –

+0

Evet. İşte denediğim ilkeller. Hepsi bir hataya sebep oluyor. Sanırım Protobuf-net kütüphanesi tarafından zaten tanımlanmışlar. – sgtz

cevap

4

bu doğrudan zaten yapmak arzusu ile varsayılan olarak ele düşünüyorum teklif edildi ve benim bakmak için, ama: kalıtımın bir parçası olarak dahili serileştirme (int vb) ile türleri tedavi çok ilginç olmayan bazı teknik sorunları vardır. Buradaki tavsiyem genel somut uygulama ile soyut bir taban sınıfı ve çalışma zamanında beklenen türlerin her birini belirtmek için taban türünde bir "içerme" özniteliği kullanmaktır - Foo<int>, Foo<string> vb. DynamicType da burada dikkate alınacaktır. Birkaç küçük ince ayar olmadan bu hemen sözlük için çalışacağını düşünmüyorum. Yine de yapabilirdi.

+0

+1 ty. Evet. Bu iyi çalışır. Önerin için teşekkürler. – sgtz

İlgili konular