2009-06-01 6 views
1

Я быть представлен следующим Exception при попытке сериализовать класс, который содержит перечисления в качестве запутанного проекта:запутывание и protobuf.net - исключение: по умолчанию значения перечисления не определенно

ProtoBuf.ProtoException: значение по умолчанию перечисления X не определен для дополнительного имущества Y

Если исключить все затрагиваемые перечислений от запутывания все работает нормально, однако, я перешел на protobuf.net, чтобы иметь возможность затемнять больше содержания кода, так что я надеюсь, является лучшим решением.

Так это обфускатор, который много подходит для protobuf.net или я объявляю свои перечисления неправильным способом?

Я попытался:

[ProtoContract] 
    public enum X 
    { 
     Y, Z 
    } 

и

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

также без контракта на всех и несколько других не столь очевидных вещей, но ничего, кроме исключения работает. Кстати: есть ли пример где-то, что мы делаем с перечислениями при использовании protobuf.net?

+0

(примечание я добавил пример, который работает для меня с .NET Reactor) –

ответ

0

Хммм .... Я честно не знаю обфускации с перечислениями; Мне придется подготовить тестовый пример для расследования.

Это поможет, если вы скажете мне, какой инструмент обфускации вы используете. Это также поможет увидеть, как вы указываете значение по умолчанию (то есть определение свойства).

Обратите внимание, что в случае перечислений он действительно учитывает только [ProtoEnum] ([ProtoContract] может использоваться, чтобы указать ему имя, но это не используется, если вы не генерируете файлы .proto, что очень маловероятно), - но я не ожидайте, что это повлияет на что-либо в этом случае (это используется для изменения значения «на проводе» до разных значений, чем в .NET). Что касается примеров; Признаюсь, я отстаю от документации, но enum test cases here показывают типичное использование.

Я зарегистрировал это как Issue 59; если вы можете сообщить мне подробности выше (либо здесь, либо отправить мне по электронной почте - см. мой профиль), я попытаюсь расследовать.

(если вы не знаете, я автор Protobuf-нетто)


Я попробовал следующее (с использованием .NET Reactor), и она работала отлично ... неявное значение по умолчанию ноль по значениям перечисления является наиболее вероятным подозреваемым. Можете ли вы предоставить тестовый пример, который показывает, что он не работает?

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

Привет Марк, я использую .Net Reactor. Не знаете, что вы имеете в виду со значением по умолчанию (определение свойства), может быть, это проблема? : P Я просто использую перечисления, представленные в примере кода. Я взглянул на примеры уже, но не имел успеха. Я не создаю прото-файлы. Может быть, я не вижу здесь очевидного - можете ли вы дать мне еще один пример того, как использовать «стандартные» перечисления в protobuf.net? – 2009-06-01 12:06:01

+0

Итак, где вы это используете? Например, у вас есть свойство «public X SomeProp {get; set;}» ... это помечено [DefaultValue (...)] (для некоторых ...)? Он отмечен как [ProtoMember (someTag, IsRequired = true)]? (Я пытаюсь выяснить, в какую ветвь он входит ...) –

+0

Глядя на ваш пример, я бы сказал, что я делаю это так же здесь. Если я смогу изолировать тестовый пример, я отправлю его. – 2009-06-01 13:20:32