2011-07-31 12 views
7

(UWAGA: Słownik, w którym T jest jakąś klasą ProtoContract/ProtoMembered działa poprawnie.) Ten problem wystąpił tylko dla mnie z obiektem typu.serializowanie Dictionary <string, object> w ProtoBuf-net ulega awarii

Próbowałem serializować słownik działającego słownika.

typeof (obiekt) nie działa. Czy to powinno być? Czy powinienem wdrożyć pracę opartą na łańcuchach?

W tym scenariuszu obiekt będzie zawsze prymitywem .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); 
    } 

próbowałem zdefiniować te typy z wyprzedzeniem ... ale myślę, że są one obsługiwane domyślnie przez protobuf netto

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

Czy znasz wszystkie możliwe rodzaje brzemienia czasu? Ile jest tutaj rodzajów? –

+0

są wszystkie typy w słowniku można serializować? –

+0

Tak. Oto prymitywy, których próbowałem. Wszystkie powodują błąd. Myślę, że są już zdefiniowane przez bibliotekę Protobuf-net. – sgtz

Odpowiedz

4

pragnienie, aby to zrobić już bezpośrednio został zaproponowany i jest na mojej liście do obejrzenia, ale: traktowanie typów z wbudowaną serializacją (int itp.) w ramach dziedziczenia ma pewne problemy techniczne, które nie są bardzo interesujące. Moje zalecenie tutaj jest użycie abstrakcyjnej klasy bazowej z ogólną implementacją konkretną, oraz atrybut "include" na typie podstawowym, aby zacytować każdy z oczekiwanych typów w czasie wykonywania - Foo<int>, Foo<string> itd. Również DynamicType będzie tutaj rozważany, ale bez kilku drobnych poprawek nie sądzę, że to działa natychmiastowo dla słownika. Może jednak zrobić.

+0

+1 ty. tak. To zadziała dobrze. Dzieki za sugestie. – sgtz

Powiązane problemy