2012-08-08 8 views
5

Sto usando Protobuf.net per serializzare alcune classi. Mi piacerebbe essere in grado di serializzare la classe SuperHero (sotto) senza dover specificare [ProtoInclude] sulla classe base. Questo perché le classi derivate vengono generate automaticamente ma la classe base non lo è, quindi la classe base non conosce direttamente le sue classi derivate.Protobuf.net: come gestire l'ereditarietà senza [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; } 
    } 

Sto usando l'ultima versione di protobuf.net.

risposta

6

Prima nota: ad un certo punto, il codice deve conoscere la sottoclasse, magari tramite la configurazione. È importante che in qualche modo sia possibile riprodurre in modo affidabile i numeri per ciascun sottotipo. L'incremento di un contatore quando si trovano i tipi in fase di esecuzione non è sufficiente se si memorizzano i dati sul disco ecc., Poiché non è possibile trovare i tipi nello stesso ordine alla successiva esecuzione. Così; supponiamo che tramite qualche meccanismo si dispone di un numero intero positivo univoco che rappresenta SuperHero come una sottoclasse di persona:

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

Poi, a dire protobuf-net su questo sottotipo:

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

Questo è equivalente a ciò che fa il codice di elaborazione degli attributi quando vede [ProtoInclude(...)]

+1

Il "meccanismo in uso" che ho usato è stato creare una versione personalizzata di "ProtoContractAttribute" in modo da poter decorare una classe derivata con "[Pr otoContract (7)] 'che si comporterebbero come decorare la classe base con' [ProtoInclude (typeof (SuperHero), 7)] '. Il fatto che gli attributi siano "sigillati" è sfortunato, comunque. –

+0

Grazie per la risposta molto rapida! Questo chiarisce bene le cose per me. –

Problemi correlati