2014-07-24 7 views
4

J'ai ce modèle:Protobuf net non sérialisation type générique hérite de type générique

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<>))] 
public class XClass<T> 
{ 
    public XClass() 
    { 
    } 

    [ProtoMember(1)] 
    public T Value { get; set; } 
} 

[ProtoContract] 
public class TestRequest<T>: XClass<T> where T : ConcreteClass 
{ 

    public TestRequest() 
    { 
    } 

} 

[ProtoContract] 
public class ConcreteClass 
{ 
    [ProtoMember(1)] 
    public string Name { get; set; } 
} 

Et si j'essaie de sérialisation et la désérialisation avec protobuf-net:

TestRequest<ConcreteClass> request = new TestRequest<ConcreteClass>(); 
request.Value = new ConcreteClass() { Name = "test" }; 
MemoryStream msTestString = new MemoryStream(); 
Serializer.Serialize(msTestString, request); 
msTestString.Position = 0; 
request = Serializer.Deserialize < TestRequest<ConcreteClass>>(msTestString); 

Et après Si j'inspecte request.Value, c'est null.

Qu'est-ce que je fais mal?

+0

Quelle est la valeur de msTestString avant d'essayer de le désérialiser? –

+0

duplication possible de [protobuf avec héritage?] (Http://stackoverflow.com/questions/4746678/protobuf-with-inheritance) –

+0

Aucun doublon. J'ai seulement un problème si le type générique hérite d'un autre type générique. –

Répondre

1

Ceci est par nature avec protobuf-net. Une des raisons pour lesquelles les données sont si rapides et si légères est qu'elles ne s'inquiètent pas des informations de type. Ceci, malheureusement (bien, selon votre point de vue) exclut complètement l'héritage avec lui.

voir protobuf with inheritance? pour plus d'infos

1

Du point de vue de protobuf-net, il est apprêté et prêt pour recevoir le type générique ouvert TestRequest<> comme champ 2 ... Cependant, rien n'existe jamais comme TestRequest<>: fermé seulement générique Les types existent en tant qu'objets réels, donc TestRequest<> n'est simplement pas utile pour protobuf-net.

Quelle aurait travail dans certains scénarios est la suivante:

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<Foo>))] 
[ProtoInclude(3, typeof(TestRequest<Bar>))] 
[ProtoInclude(4, typeof(TestRequest<Blap>))] 

Cependant, il est probablement pas une bonne idée de mélanger cela avec les génériques eux-mêmes.

Je soupçonne ce que vous réellement veulent est:

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<T>))] 
public class XClass<T> {} 

cependant, je ne sais pas si ce même compilable, et encore moins si elle est ce que vous recherchez. En réalité, mon opinion est que si vous êtes lié à ce genre de nœud, vous êtes probablement en train de compliquer votre modèle de sérialisation - souvent le résultat d'essayer de sérialiser votre modèle de domaine principal - et il est peut-être temps de passer à un modèle plus simple et dédié.

Questions connexes