2011-01-20 13 views
8

¿Es posible usar protobuf con clases que heredan?protobuf con herencia?

quiero hacer algo como esto

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

class FunctionBody{ 
    repeatable Expr expr; 
} 
+0

Una buena discusión se puede encontrar en esta publicación de blog: http://www.indelible.org/ink/protobuf-polymorphism/ – earcam

Respuesta

10

No en la implementación de la base - que se desea utilizar en su lugar la encapsulación.

Sin embargo, si está utilizando simplemente protobuf-net, como código en primer lugar, me hackeo a su alrededor:

[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>()); } 
    } 
} 

Por supuesto, estoy suponiendo que existe algún detalle adicional en las clases - "tal como es "solo podría usar una enumeración (que es bien respaldada).