亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

版本中更改了 Protobuf-net 枚舉序列化行為。2.3.0

版本中更改了 Protobuf-net 枚舉序列化行為。2.3.0

C#
陪伴而非守候 2022-10-23 15:58:36
如果 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
{...}

我會調查這里發生的事情。


查看完整回答
反對 回復 2022-10-23
  • 1 回答
  • 0 關注
  • 107 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號