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



如果 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 之后,它将产生字节 [] { 8, 1 }

有什么方法可以使更高版本以与早期版本相同的方式序列化?

这是...意料之外。我还不明白这里发生了什么,但你是对的,发生了变化。看起来历史上使用InferTagFromNameDefault时枚举值的偏移量为1,并且"枚举直通"检查未能解释这一点("枚举直通"现在评估为true这里,以前会false

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

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

或通过属性:

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

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

相关内容

最新更新