2011-09-21 8 views
10

Cómo me serializar un objeto de este tipo con protobuf-net:Serialize List <object> (donde los objetos son primitivas soportadas) en Protobuf.NET?

public class MyObject{ 
    public string Key {get; set;} 
    public List<Object> Values {get; set;} 
} 

Cuando intento para serializar esto con un TypeModel protobuf-net lanza un error que indica que no sabe cómo serializar System.Object . Ahora sé que los valores solo contendrán primitivas (int, string, float, DateTime, etc.). Entonces, ¿cómo dejo que protobuf-net sepa sobre esto?

+0

DateTime no es un primitivo. –

+0

Sin embargo, es serializable. – cHao

+0

No sé protobuf pero estás pidiendo muchísimo de un serializador. –

Respuesta

9

Esto no es realmente factible en ProtoBuf puro, en ningún sentido. ProtoBuf está fuertemente tipado, pero no contiene información de tipo en el mensaje; la información de tipo siempre se especifica externamente. Por lo tanto, hay dos soluciones "buenas"; Es decir, soluciones que serían fáciles de interpretar mediante una implementación de protobuf distinta de Protobuf-net (que puede que te importe o no, pero parece que sí).

1: Reemplazar List<object> con List<PrimitiveType> donde PrimitiveType contiene campos opcionales que corresponde a todos los 12-o-so tipos primitivos (Dependiendo de la definición de "Primitive Type".), Y se asegura sólo uno de ellos se puso al corriente de cada instancia.

2: Reemplazar List<object> con una combinación de List<int>, List<double>, List<string> etc.

0

Ver In Protobuf-net how can I pass an array of type object with objects of different types inside, knowing the set of potential types in advance.

Según Marc post (el autor de Protobuf.NET) object es problemático. Aunque no puedo encontrarlo ahora, recuerdo claramente ver un cheque para object en la fuente para lanzar una excepción contra los intentos de serializar las propiedades del objeto directamente.

Para solucionar esto, debe usar una clase más específica para ser serializada y no usar object directamente. Puede usar IProtoSerializer para implementar la serialización/deserialización personalizada. Protobuf también admitirá las interfaces ISerializable y IXmlSerializable si eso ayuda.

+2

Para aclarar: protobuf-net no no * consume * 'ISerializable' ni' IXmlSerializable', sino que puede usarse para * implementar * ellos. 'IProtoSerializer' es una clase * internal * y no se puede usar de forma aislada. –

+0

@MarcGravell Gracias por la aclaración. –

Cuestiones relacionadas