如果 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 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消