1

尝试序列化包含混淆项目中的枚举的类时,出现以下异常:

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

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

那么是混淆器对 protobuf.net 造成了很大的影响,还是我以错误的方式声明我的枚举?

我努力了:

    [ProtoContract]
    public enum X
    {
        Y, Z
    }

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

也根本没有合同和其他一些不那么明显的事情,但除了排除工作之外什么都没有。顺便说一句:在使用 protobuf.net 时,我们与枚举有什么关系吗?

4

1 回答 1

0

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

如果您能告诉我您正在使用什么混淆工具,那将会有所帮助。查看您如何指定默认值(即属性定义)也将有所帮助。

请注意,它仅[ProtoEnum]在枚举的情况下才真正考虑([ProtoContract]可用于为其命名,但除非您正在生成 .proto 文件,否则不会使用它,这不太可能) - 但我不希望它在这种情况下会影响任何事情(这用于将“在线”值更改为与 .NET 中不同的值)。至于例子;我承认我落后于文档 - 但这里的枚举测试用例显示了典型用法。

我已将此记录为第 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 }
于 2009-06-01T11:50:44.020 回答