Protobuf-net枚举序列化行为在版本中发生了变化。 2.3.0

问题描述 投票:3回答:1

2.3.0之前的任何序列化对象如果包含枚举值并且使用DataMember和InferTagFromNameDefault而不是ProtoMember,则无法在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之前,这将导致字节[] {8,2},并且在2.3.0之后将导致byte [] {8,1}

有什么方法可以让以后的版本序列化与早期版本相同?

c# protobuf-net
1个回答
2
投票

这是......意料之外的。我还不明白这里发生了什么,但是你确实发生了变化。看起来历史上使用1时,InferTagFromNameDefault在枚举值上有一个偏移量,并且“enum passthru”检查无法解释这一点(“enum passthru”现在正在评估true,此前它本来就是false) 。

以下似乎在运行时解决了这个问题:

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

或通过属性:

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

我会调查这里发生的事情。

© www.soinside.com 2019 - 2024. All rights reserved.