如果 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 之后,这将导致 byte [] { 8, 1 }有什么办法可以使以后的版本以与早期版本相同的方式进行序列化?
1 回答

慕桂英546537
TA贡献1848条经验 获得超10个赞
这是……意料之外的。我还不明白这里发生了什么,但你说得对,发生了变化。从历史上看,1
使用 时枚举值存在偏移量InferTagFromNameDefault
,并且“枚举 passthru”检查无法解释这一点(“enum passthru”现在评估到true
这里,它本来应该是false
以前的位置)。
以下似乎在运行时解决了这个问题:
RuntimeTypeModel.Default.Add(typeof(MyEnum), true).EnumPassthru = false;
或通过属性:
[ProtoContract(EnumPassthru = false)] public enum MyEnum {...}
我会调查这里发生的事情。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报
0/150
提交
取消