[英]protobuf-net : enum type conversion error
namespace MyNamespace
{
public enum MyEnum
{
EnumName1 = 1,
EnumName2 = 2,
...
[ProtoContract(Name=@"MyClassProto")]
[Serializable]
public class MyClass : IExtensible
{
[ProtoMember(1, IsRequired = false, Name = @"MyEnumProperty", DataFormat = ProtoBuf.DataFormat.Default)]
[System.ComponentModel.DefaultValue(1)]
public MyEnum MyEnumProperty;
...
var myObjectIn = new MyClass
{
MyEnumProperty = MyEnum.EnumName1,
...
};
MyClass myObjectOut;
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(stream, myObjectIn);
stream.Seek(0, SeekOrigin.Begin);
myObjectOut = ProtoBuf.Serializer.Deserialize<MyClass>(stream);
}
System.InvalidCastException:从'System.Int32'到'MyNamespace.MyEnum'的无效转换。
我正在使用protobuf-net v2.1.0,并且根据方法,我得到两个不同的ProtoException
。 No wire-value is mapped to the enum MyEnum
,或者No parameterless constructor found
。 原因是:默认int值0在您的枚举类型中不是常量,或者您没有在参数构造函数中为其分配默认值。
解决方法(逻辑或):
public enum MyEnum { EnumName1 = 1, EnumName2 = 2, @default = 0 }
要么
public MyClass() { MyEnumProperty = MyEnum.EnumName1 }
- 没有显式声明基础类型的枚举声明具有基础类型int。 如果枚举成员是用枚举类型声明的第一个枚举成员,则其关联值为零。
- 枚举用于“多选”方案,在这种情况下,运行时决策由编译时已知的固定数量的选择决定
因此,带有尚未定义为编译时常量imo的运行时值的枚举是一个不好的枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.