2011-01-20 11 views
8

È possibile utilizzare protobuf con classi che ereditano?protobuf con ereditarietà?

voglio fare qualcosa di simile

class Expr; 
class AddExpr : Expr; 
class CallFunc: Expr; 

class FunctionBody{ 
    repeatable Expr expr; 
} 
+0

Una buona discussione può essere trovata in questo post del blog: http://www.indelible.org/ink/protobuf-polymorphism/ – earcam

risposta

10

Non nell'attuazione nucleo - si desidera utilizzare l'incapsulamento, invece.

Tuttavia, se si utilizza solo protobuf-net, come codice-prima, ho incidere intorno esso:

[ProtoInclude(1, typeof(AddExpr))] 
[ProtoInclude(2, typeof(CallFunc))] 
[ProtoContract] 
class Expr {} 

[ProtoContract] 
class AddExpr : Expr {} 
[ProtoContract] 
class CallFunc: Expr {} 

[ProtoContract] 
class FunctionBody{ 
    private List<Expr> expressions; 
    [ProtoMember(1)] 
    public List<Expr> Expressions { 
     get { return expressions ?? (expressions = new List<Expr>()); } 
    } 
} 

Naturalmente, sto assumendo c'è qualche dettaglio aggiuntivo nelle classi - "così come sono "potresti semplicemente usare un enum (che è supportato da).