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之前,这将导致一个字节[] {8,2} 在2.3.0之后,它将导致字节[] {8,1}
有什么办法可以使较早版本进行序列化呢?
答案 0 :(得分:2)
这是意外的。我还不了解这里发生了什么,但是您说对了,这是对的。从历史上看,使用1
时,枚举值存在InferTagFromNameDefault
的偏移量,并且“ enum passthru”检查无法解决这一问题(“ enum passthru”现在评估为{{1 }},之前是true
的地方。
以下内容似乎可以在运行时解决此问题:
false
或通过属性:
RuntimeTypeModel.Default.Add(typeof(MyEnum), true).EnumPassthru = false;
我将调查这里发生的事情。