C# 模糊处理和protobuf.net-异常:未定义默认枚举值

C# 模糊处理和protobuf.net-异常:未定义默认枚举值,c#,obfuscation,protocol-buffers,protobuf-net,C#,Obfuscation,Protocol Buffers,Protobuf Net,在尝试序列化模糊项目中包含枚举的类时,出现以下异常: ProtoBuf.ProtoException:未为可选属性Y定义默认枚举值X 如果我从模糊处理中排除所有受影响的枚举,一切都会正常运行,但是,我切换到protobuf.net以能够模糊更多的代码内容,所以我希望有更好的解决方案 那么,是protobuf.net的混淆器造成了很大的混乱,还是我以错误的方式声明了我的枚举 我试过: [ProtoContract] public enum X { Y, Z

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

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

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

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

我试过:

    [ProtoContract]
    public enum X
    {
        Y, Z
    }


也没有合同和其他一些不太明显的东西,但除了排除工程外什么都没有。顺便问一下:在使用protobuf.net时,是否有一个我们必须处理枚举的例子?

Hmmm。。。。老实说,我不知道Enum的混淆问题;我必须准备一个测试用例进行调查

如果你能告诉我你在用什么样的模糊处理工具,那会有帮助的。查看如何指定默认值(即属性定义)也会有所帮助

注意,它只在枚举的情况下考虑
[ProtoEnum]
(可以使用
[ProtoContract]
给它一个名称,但除非生成.proto文件,否则不使用它,这是不太可能的)-但我不希望它在这种情况下影响任何东西(这用于更改“在线”上的值)与.NET中的值不同)。例如,;我承认我在文档方面落后了,但是它显示了典型的用法

我已将此记录为;如果你能让我知道上面的细节(或者在这里,或者给我发电子邮件-查看我的个人资料),我会尝试调查

(如果你不知道,我是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 }

嗨,马克,我在用.Net反应堆。不知道默认值(属性定义)是什么意思可能这就是问题所在:P我只使用代码示例中显示的枚举。我已经看了一些例子,但是没有成功。我没有生成原型文件。也许我没有看到明显的问题-你能给我举一个关于如何在protobuf.net中使用“标准”枚举的例子吗?那么你在哪里使用这个呢?例如,您是否有一个属性“public X SomeProp{get;set;}”。。。这是否标记为[DefaultValue(…)](对于某些…)?它是否标记为[ProtoMember(someTag,IsRequired=true)]?(我试图找出它将进入哪个分支…)看看你的例子,我会说我在这里也是这样做的。如果我能分离出一个测试用例,我会发布它。(注意,我添加了一个使用.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 }