在尝试序列化包含混淆项目中的枚举的类时,我遇到以下异常:
ProtoBuf.ProtoException:没有为可选属性Y定义默认枚举值X
如果我从混淆中排除所有受影响的枚举,一切运行正常,但是,我切换到protobuf.net以便能够混淆更多的代码内容,所以我希望有更好的解决方案。
对于protobuf.net来说,混淆器是不是很复杂,或者我是否以错误的方式声明我的枚举?
我试过了:
[ProtoContract]
public enum X
{
Y, Z
}
和
[ProtoContract]
public enum X
{
Y=0, Z=1
}
也没有合同和其他几个不那么明显的东西,但除了排除工作之外什么也没有。顺便说一句:在使用protobuf.net时,我们有什么与枚举有关的例子吗?
答案 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 }