Obfuscation和protobuf.net - 例外:未定义默认枚举值

时间:2009-06-01 11:34:31

标签: c# obfuscation protocol-buffers protobuf-net

在尝试序列化包含混淆项目中的枚举的类时,我遇到以下异常:

  

ProtoBuf.ProtoException:没有为可选属性Y定义默认枚举值X

如果我从混淆中排除所有受影响的枚举,一切运行正常,但是,我切换到protobuf.net以便能够混淆更多的代码内容,所以我希望有更好的解决方案。

对于protobuf.net来说,混淆器是不是很复杂,或者我是否以错误的方式声明我的枚举?

我试过了:

    [ProtoContract]
    public enum X
    {
        Y, Z
    }

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

也没有合同和其他几个不那么明显的东西,但除了排除工作之外什么也没有。顺便说一句:在使用protobuf.net时,我们有什么与枚举有关的例子吗?

1 个答案:

答案 0 :(得分:0)

嗯......我真的不知道枚举的混淆问题;我将不得不准备一个测试案例进行调查。

如果你能告诉我你正在使用什么混淆工具会有所帮助。它还有助于了解您如何指定默认值(即属性定义)。

请注意,在枚举的情况下它只考虑[ProtoEnum][ProtoContract]可用于为其命名,但除非您生成.proto文件,否则不会使用此文件。是不太可能的) - 但我不认为它会影响这种情况下的任何东西(这用于将“线上”的值更改为不同于.NET中的值)。至于例子;我承认我落后于文档 - 但enum test cases here显示了典型用法。

我已将其记录为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 }