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; }
}
Véase la respuesta actualizada; esto en realidad se incluye en compilaciones posteriores –