2012-08-08 12 views
5

Estoy usando Protobuf.net para serializar algunas clases. Me gustaría poder serializar la clase SuperHero (a continuación) sin tener que especificar [ProtoInclude] en la clase base. Esto se debe a que las clases derivadas se generan automáticamente pero la clase base no, por lo que la clase base no conoce directamente sus clases derivadas.Protobuf.net: cómo manejar la herencia sin [ProtoInclude]

[ProtoContract] 
    class Person 
    { 
     [ProtoMember(1)] 
     public int Id { get; set; } 
     [ProtoMember(2)] 
     public string Name { get; set; } 
    } 

    [ProtoContract] 
    class SuperHero : Person 
    { 
     [ProtoMember(3)] 
     public string Powers { get; set; } 
    } 

Estoy utilizando la última versión de protobuf.net.

Respuesta

6

Primero una nota: en algún punto, su código debe conocer la subclase, quizás a través de la configuración. Es importante que de alguna manera sea capaz de reproducir números de manera confiable para cada subtipo. Incrementar un contador cuando encuentre los tipos en el tiempo de ejecución no es suficiente si está almacenando datos en el disco, etc., ya que es posible que no encuentre los tipos en el mismo orden la próxima vez que se ejecute. Asi que; Vamos a suponer que a través de algún mecanismo tiene un entero positivo único que representa superhéroe como una subclase de la persona:

int tag = 7; // why not 
Type subType = typeof(SuperHero); 

Luego, a decir protobuf-net sobre este subtipo:

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType); 

Esto es equivalente a lo que hace el código de procesamiento de atributos cuando ve [ProtoInclude(...)]

+1

El "algún mecanismo" que utilicé fue crear una versión personalizada del 'ProtoContractAttribute' para que yo pueda decorar una clase derivada con' [Pr otoContract (7)] 'que se comportaría igual que decorar la clase base con' [ProtoInclude (typeof (SuperHero), 7)] '. Sin embargo, el hecho de que los atributos estén "sellados" es desafortunado. –

+0

¡Gracias por la respuesta tan rápida! Eso aclara las cosas bien para mí. –

Cuestiones relacionadas