编程语言
首页 > 编程语言> > C#-Protobuf-net枚举序列化行为在版本中更改. 2.3.0

C#-Protobuf-net枚举序列化行为在版本中更改. 2.3.0

作者:互联网

如果2.3.0之前的任何序列化对象包含枚举值并且使用带有InferTagFromNameDefault而不是ProtoMember的DataMember,则在2.3.0或更高版本中将无法正确反序列化.

[DataContract]
public class ClassWithEnum
{
    [DataMember]
    public MyEnum Enum { get; set; }
}

public enum MyEnum
{
    FirstValue,
    SecondValue
}

我上这堂课使用此代码对其进行序列化.

{
    RuntimeTypeModel.Default.InferTagFromNameDefault = true;

    var v = new ClassWithEnum { Enum = MyEnum.SecondValue };

    using (var memoryStream = new MemoryStream())
    {
       Serializer.Serialize(memoryStream, v);
       var bytes = memoryStream.ToArray();
    }
}

在2.3.0之前,这将导致一个byte [] {8,2}
在2.3.0之后,它将导致字节[] {8,1}

有什么办法可以使较早版本进行序列化呢?

解决方法:

这是…始料未及的.我还不了解这里发生了什么,但是您说对了,这是对的.从历史上看,使用InferTagFromNameDefault时枚举值偏移了1,并且“枚举通过”检查无法解决这一问题(“枚举通过”现在在此处评估为true,以前该设置为false) .

以下内容似乎可以在运行时解决此问题:

RuntimeTypeModel.Default.Add(typeof(MyEnum), true).EnumPassthru = false;

或通过属性:

[ProtoContract(EnumPassthru = false)]
public enum MyEnum
{...}

我将调查这里发生的情况.

标签:protobuf-net,c
来源: https://codeday.me/bug/20191211/2105714.html