Обфускация и protobuf.net - Исключение: значение перечисления по умолчанию не определено - PullRequest
1 голос
/ 01 июня 2009

Я получаю следующее исключение при попытке сериализации класса, содержащего перечисления в запутанном проекте:

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

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

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

Я пытался:

    [ProtoContract]
    public enum X
    {
        Y, Z
    }

и

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

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

1 Ответ

0 голосов
/ 01 июня 2009

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

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

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

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

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


Я попробовал следующее (используя .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 }
...