2011-07-31 7 views
7

(NOTA: El diccionario donde T es una clase ProtoContract/ProtoMembered funciona bien.) Este problema solo me sucedió con el tipo de objeto.serializando un Diccionario <cadena, objeto> en ProtoBuf-net falla

Estaba tratando de serializar un diccionario de trabajo del diccionario.

typeof (objeto) no funciona. ¿Deberia? ¿Debo implementar un trabajo basado en cadenas?

En este escenario, el objeto solo será una primitiva .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); 
    } 

Me trataron de definir estos tipos antes de tiempo ... pero yo creo que sean manejados de manera predeterminada por 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

¿Conoces todos los tipos posibles hace tiempo? ¿Cuántos tipos hay aquí? –

+0

son todos los tipos del diccionario serializables? –

+0

Sí. Aquí están los primativos que probé. Todos ellos causan un error. Creo que ya están definidos por la biblioteca Protobuf-net. – sgtz

Respuesta

4

El deseo de hacer esto directamente ya tiene ha sido propuesto, y está en mi lista para ser visto, pero: tratar tipos con serialización incorporada (int, etc.) como parte de la herencia tiene algunos problemas técnicos que no son muy interesantes. Mi recomendación aquí es usar una clase base abstracta con implementación concreta genérica y un atributo "incluir" en el tipo base para citar cada uno de los tipos esperados en tiempo de ejecución: Foo<int>, Foo<string>, etc. DynamicType también sería una consideración aquí, pero sin algunos ajustes menores, no creo que esto funcione inmediatamente para el diccionario. Podría hacerlo, sin embargo.

+0

+1 ty. sí. Eso funcionará bien. Gracias por la sugerencia. – sgtz

Cuestiones relacionadas