2012-09-18 7 views
9

estoy recibiendo el siguiente mensaje de error al intentar serializar List<Tuple<string, Type, object>>: No se ha definido para el tipo Serializador: System.Typemensaje Protobuf-Net de error: No se Serializador definido para el tipo: System.Type

He intentado tanto, simplemente la serialización la colección anterior o serialización de una clase que tiene la misma colección definida como protoMember. Ambos dan como resultado el mismo mensaje de error.

¿Es este un tipo no admitido? Supongo que es compatible y pasé por alto algo más, pero ¿tal vez soy incorrecto?

Gracias por cualquier punteros que pueden ayudar a resolver este ...

+0

Véase la respuesta actualizada; esto en realidad se incluye en compilaciones posteriores –

Respuesta

12

Editar:

Soporte para Type serialización está incluido en r580


protobuf-net está destinado para serializar su datos, no su implementación; Type es un detalle de implementación. Estrictamente hablando, no sería muy difícil agregar (algunos de los detalles específicos de la implementación ya terminan almacenando información de Type, a través del nombre-calificado-ensamblado), pero: no es un escenario clave, y en muchos maneras es no algo que le animo a serializar: el punto de los buffers de protocolo es que puede cargar los datos en cualquier plataforma, con la tolerancia de versión como característica clave. El almacenamiento de la información Type infringe ambos.

También hay que señalar que la mayoría de los otros serializadores (excepto quizá BinaryFormatter, que ya rompe todas las reglas de la plataforma/versión de tolerancia) se también niegan a serializar un Type; XmlSerializer, DataContractSerializer, JavaScriptSerializer etc todos lanzamos una excepción para este escenario (acabo de comprobarlos).

Además: object es incluso menos compatible, a menos que utilice la característica DynamicType.


Así es como se podría hacer a través de una madre sustituta en Type:

using ProtoBuf; 
using ProtoBuf.Meta; 
using System; 
using System.Runtime.Serialization; 

static class Program 
{ 
    public static void Main(string[] args) 
    { 
     // register a surrogate for Type 
     RuntimeTypeModel.Default.Add(typeof(Type), false) 
           .SetSurrogate(typeof(TypeSurrogate)); 
     // test it 
     var clone = Serializer.DeepClone(new Foo { Type = typeof(string) }); 
    } 
} 

[ProtoContract] 
class TypeSurrogate 
{ 
    [ProtoMember(1)] 
    public string AssemblyQualifiedName { get; set; } 
    // protobuf-net wants an implicit or explicit operator between the types 
    public static implicit operator Type(TypeSurrogate value) 
    { 
     return value==null ? null : Type.GetType(value.AssemblyQualifiedName); 
    } 
    public static implicit operator TypeSurrogate(Type value) 
    { 
     return value == null ? null : new TypeSurrogate { 
      AssemblyQualifiedName = value.AssemblyQualifiedName }; 
    } 
} 

[DataContract] 
public class Foo 
{ 
    [DataMember(Order=1)] 
    public Type Type { get; set; } 
} 
+0

gracias por sus comentarios. ¿Pero cómo vas a serializar tal colección? Necesito enviarlo a través de un bus de mensajes que solo permite el transporte de matrices de bytes. ¿Está transformando Tipo en una cadena y luego convirtiéndola de nuevo en una opción Escribir una? Estoy de acuerdo con usted en los tipos de objetos, creo que le pregunté antes y me indicó la función DynamicType. –

+0

@Freddy de hecho, lo más simple sería almacenar 'string, string, object', usando' .AssemblyQualifiedName' y 'Type.GetType (string)'. Si desea obtener * realmente * exótico, probablemente podría agregar un * sustituto * para 'Tipo' (protobuf-net lo admite). En el nivel técnico, * podría * apoyarlo directamente sin demasiado dolor, pero parece que haría que sea muy fácil para la gente pegarse un tiro en el pie ... con una bazooka. –

+0

gracias por los consejos, realmente aprecio. Parece razonable mantener la biblioteca, dado que la plataforma y la independencia de la versión es el objetivo deseado.Ya asumí lo que describió en su respuesta, ya que almacena tipos a través de nombres calificados para ensamblaje, de lo contrario, probablemente no entiendo cómo el deserializador maneja sus tareas más tarde sin la ayuda del tipo de información. Pero puedo estar completamente apagado ya que no he visto su código fuente en absoluto. –

Cuestiones relacionadas