2010-08-06 5 views
2

Je n'arrive pas à trouver comment obtenir protobuf-net pour sérialiser un objet qui dérive de la liste < T>. J'ai essayé d'ajouter l'attribut ProtoInclude mais je reçois un ProtoBuf.ProtoException: Liste de type connu`1 pour ProtoIncludeAttribute doit être une sous-classe directe de UserTypeCollection. Lorsque je supprime l'attribut ProtoInclude, il semble que les données ne soient pas sérialisées du tout. Je n'arrive pas à trouver des exemples de cette situation nulle part. J'ajoute la sérialisation protobuf comme option pour notre API WS et je dois maintenir la compatibilité avec DataContractSerializer.protobuf-net et dérivant de collections génériques

[CollectionDataContract(), ProtoContract(InferTagFromName = true)] 
[ProtoInclude(100, typeof(List<UserType>))] 
public class UserTypeCollection : List<UserType> 
{ ... } 

[DataContract(), ProtoContract(InferTagFromName = true)] 
public class UserType { ... } 
+0

Quel est l'objet que vous numérisez? La liste? ou un objet extérieur? –

Répondre

3

ProtoInclude est utilisé pour désigner sous types, et non pas les types de carte (après tout, est déjà connu du type de base). En outre, le IList<T> traitant devrait être largement implicite; notez que le "infer ..." etc. fait très peu dans le cas des listes, puisque les listes sont juste une séquence des articles contenus.

Pour ce qui suit, je suppose que vous essayez de sérialiser la liste (comme haut-objet le plus):

Je ne suis pas sur la machine juste au moment, mais dans le publié dll, je voudrais attendre que enveloppant la liste via un objet ferait fonctionner: Dans « v2 » J'espère

[DataContract] 
public class Foo { 
    private readonly UserTypeCollection items = new UserTypeCollection(); 
    [DataMember(Order=1)] 
    public UserTypeCollection Items {get{return items;}} 
} 

que ce scénario fonctionne dès le début. Je vais essayer de tester ça demain (quand j'aurai la bonne machine).

Une autre pensée; le sous-classement List<T> n'est généralement pas très utile, car aucune des méthodes n'est virtuelle. A vous, bien sûr. Et une note finale - dans "v2" nous pouvons décrire le modèle en externe si vous voulez avoir plus de contrôle sur la sérialisation mais sans impact sur les types eux-mêmes.

Questions connexes