2010-11-09 19 views
11

Que faut-il faire pour sérialiser les enums avec protobuf-net? Je reçois l'erreur ci-dessous lors de la sérialisation d'une classe ayant une propriété enum, si l'attribut DataMember est supprimé de la déclaration de propriété, il fonctionne correctement.protobuf-net enum serialization

"System.InvalidOperationException: Seules les classes de contrat de données (et listes/tableaux de tels) peuvent être traitées"

+0

Avez-vous un exemple? Cela devrait fonctionner correctement ... –

+0

Bonjour Marc! Merci pour l'article sur la désertification. Liste en utilisant Protobuf.net. J'ai le même problème. Je vais poster un exemple ci-dessous. –

Répondre

14

Je suspect ils sont en fait 2 différents scénarios , mais en ce qui concerne l'exemple de code ajouté par Andrew, c'est parce qu'il ne peut pas comprendre (à l'avance) ce qu'il va faire par rapport aux valeurs par défaut (par défaut, les données sont traitées comme facultatif au récepteur). Il y a 3 façons de fixer ceci:

1: ajouter un ENUM avec la valeur 0 (puisque 0 est toujours la valeur par défaut CLI pour les zéros), par exemple

public enum SiteType 
{ 
    Error = 0, 
    ... 

2: lui dire la valeur à utiliser par défaut:

[ProtoMember(10), DefaultValue(SiteType.Partition)] 
public SiteType Type { get; set; } 

3: dire le moteur qu'il n'a pas vraiment besoin de s'inquiéter à ce sujet, à savoir qu'il est va avoir une valeur:

[ProtoMember(10, IsRequired = true)] 
public SiteType Type { get; set; } 
+1

Merci. Maintenant ça marche! Avec protobuf-net je réduis mon trafic, accélère à 10 fois avec mon service WCF. C'est vraiment un bon moyen d'augmenter la performance. Je pense que ce devrait être un moyen commun de travailler avec ce protocole \ net. Malheureusement, il n'y a pas beaucoup d'exemples sur l'application de protobuf.net avec WCF –

+1

@Andrew - commentaires notés. Je vais essayer d'améliorer cela. –

+0

Mon problème était que nous avions sérialisé une liste d'objets et que l'une des propriétés n'avait pas IsRequired = true. Je suppose que ce serait bien dans ce cas d'inclure une exception interne. – Kimi

4

Exemple:

[DataContract] 
[ProtoContract] 
public enum SiteType 
{ 
    [EnumMember] 
    [ProtoEnum] 
    Site = 1, 
    [EnumMember] 
    [ProtoEnum] 
    Partition = 2, 
    [EnumMember] 
    [ProtoEnum] 
    Module = 3 
} 

[DataContract] 
[Serializable] 
[ProtoContract] 
public class SiteDTO 
{ 
    [DataMember] 
    [ProtoMember(1)] 
    public int Id { get; set; } 
    ... 
    [DataMember] 
    [ProtoMember(10)] 
    public SiteType Type { get; set; } 
} 
+0

Merci pour l'exemple Andrew. Je l'ai maintenant localement et je vais y travailler. J'imagine que c'est tout simplement enthousiasmant de décider que c'est un objet complexe. Je suppose que dans mon utilisation de WCF je n'ai simplement jamais décoré des enums avec '[DataContract]'. Je n'ai pas encore vérifié, mais je suppose que cela fonctionne bien si vous supprimez les attributs sur l'énumération? –

+0

quand j'essaie cela, l'erreur que je reçois est sur la valeur enum defualt (c'est ce que vous voyez?) Qui n'est pas vraiment le même que rapporté par Al. Cependant, j'ai ajouté une réponse qui (je pense) adresse * votre * question. –