2009-06-01 11 views
1

Je suis présenté à l'exception suivante lorsque vous essayez de sérialiser une classe qui contient énumérations dans un projet obscurcie:obscurcissement et protobuf.net - Exception: Valeur par défaut ENUM non définie

ProtoBuf.ProtoException: Le valeur par défaut enum X n'est pas défini pour la propriété en option y

Si j'excluons toutes les énumérations visés obscurcissement tout fonctionne bien, cependant, je suis passé à protobuf.net pouvoir obscurcir plus le contenu du code, donc j'espère que est une meilleure solution.

Alors, est-ce l'obfuscateur qui dérange beaucoup pour protobuf.net ou est-ce que je déclare mes énumérations dans le mauvais sens?

J'ai essayé:

[ProtoContract] 
    public enum X 
    { 
     Y, Z 
    } 

et

[ProtoContract] 
    public enum X 
    { 
     Y=0, Z=1 
    } 

également sans contrat à tous et plusieurs autres choses pas évidentes, mais rien d'autre que l'exclusion fonctionne. En passant: Y a-t-il un exemple quelque part de ce que nous avons à faire avec les enums lors de l'utilisation de protobuf.net?

+0

(note que j'ajouté un exemple qui fonctionne pour moi avec .NET Reactor) –

Répondre

0

Hmmm .... Honnêtement, je ne suis pas au courant des problèmes d'obfuscation avec enums; Je vais devoir préparer un test pour enquêter.

Il serait utile si vous pouviez me dire quel outil d'obscurcissement vous utilisez. Cela aiderait également à voir comment vous spécifiez la valeur par défaut (c'est-à-dire la définition de la propriété). Notez qu'il ne considère vraiment que [ProtoEnum] dans le cas d'enums (le [ProtoContract] peut être utilisé pour lui donner un nom, mais il n'est pas utilisé sauf si vous générez des fichiers .proto, ce qui est très peu probable) - mais je ne vous attendez pas à ce qu'il ait un impact sur quoi que ce soit dans ce cas (ceci est utilisé pour changer la valeur "sur le réseau" à des valeurs différentes de celles de .NET). Comme pour les exemples; J'avoue que je suis derrière sur la documentation - mais le enum test cases here montre l'utilisation typique. J'ai noté cela sous Issue 59; Si vous pouviez me faire savoir les détails ci-dessus (soit ici, ou envoyez-moi un courriel - voir mon profil), je vais essayer d'enquêter.

(si vous ne saviez pas, je suis l'auteur de protobuf-net)


J'ai essayé les éléments suivants (en utilisant des réacteurs .NET) et il a bien fonctionné ... la valeur par défaut implicite de zéro sur les valeurs enum est le suspect le plus probable. Pouvez-vous fournir un test-case qui montre qu'il échoue?

using System; 
using ProtoBuf; 

[ProtoContract] 
class Foo { 
    static void Main() { 
     Foo foo = new Foo { Bar = MyEnum.B }; 
     Console.WriteLine(foo.Bar); 
     Foo clone = Serializer.DeepClone(foo); 
     Console.WriteLine(clone.Bar); // Expect "B" 
    } 

    [ProtoMember(1)] 
    public MyEnum Bar { get; set; } 
} 
enum MyEnum { A, B, C } 
+0

Salut Marc, j'utilise des réacteurs .Net. Vous ne savez pas ce que vous voulez dire par la valeur par défaut (définition de la propriété), c'est peut-être le problème? : P Je viens d'utiliser les énumérations présentées dans l'exemple de code. J'ai déjà regardé les exemples, mais je n'ai pas réussi. Je ne génère pas de fichiers proto. Peut-être que je ne vois pas l'évidence ici - pouvez-vous me donner un autre exemple sur la façon d'utiliser enums 'standard' dans protobuf.net? –

+0

Alors, où utilisez-vous cela? Par exemple, avez-vous une propriété "public X SomeProp {get; set;}" ... est-ce marqué [DefaultValue (...)] (pour certains ...)? Est-il marqué [ProtoMember (someTag, IsRequired = true)]? (J'essaie de comprendre dans quelle branche elle va ... –

+0

En regardant votre exemple, je dirais que je le fais de la même manière ici. Si je peux isoler un cas de test, je l'afficherai. –