NetCore3.1升級到Net5.0序列化方法過時問題


問題描述:Net5.0已經出來有段時間了,就琢磨的項目升級到5.0試一試的,按照方法,把項目sdk版本修改完后基本就算升級成功了,但是有個Redis序列化的方法有警告,提示這個

警告	SYSLIB0011	“BinaryFormatter.Serialize(Stream, object)”已過時:“BinaryFormatter serialization is obsolete and should not be used. See https://aka.ms/binaryformatter for more information.”

  打開微軟的說明頁面,大概意思就是隨便將泛型的數據寫入和讀取內存,存在風險隱患。

解決方案:按照微軟的提示,將方法換一下就哦了

        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static byte[] Serialize(object obj)
        {
            if (obj == null)
                return null;

            using var memoryStream = new MemoryStream();
            DataContractSerializer ser = new DataContractSerializer(typeof(object));
            ser.WriteObject(memoryStream, obj);
            var data = memoryStream.ToArray();
            return data;
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        private static T Deserialize<T>(byte[] data)
        {
            if (data == null)
                return default(T);

            using var memoryStream = new MemoryStream(data);
            XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, new XmlDictionaryReaderQuotas());
            DataContractSerializer ser = new DataContractSerializer(typeof(T));
            var result = (T)ser.ReadObject(reader, true);
            return result;
        }

有個問題,就是要序列化的類,必須多加幾個處理,比如下面這樣,當然不能保證我的解決辦法就是最優的。。。

    [Serializable]
    [KnownType(typeof(AuthorizeActionModel))]
    [DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
    public class AuthorizeActionModel : IExtensibleDataObject
    {
        /// <summary>
        /// 菜單編號
        /// </summary>
        [DataMember]
        public string SysModuleId { set; get; }
        /// <summary>
        /// 鏈接地址
        /// </summary>
        [DataMember]
        public string PageLink { set; get; }

        private ExtensionDataObject extensionData_Value;

        public ExtensionDataObject ExtensionData
        {
            get
            {
                return extensionData_Value;
            }
            set
            {
                extensionData_Value = value;
            }
        }
    }

再附帶一個小問題,就是docker鏡像路徑的變化

- docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
+ docker pull mcr.microsoft.com/dotnet/aspnet:5.0

參考地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0

https://stackoverflow.com/questions/12936713/web-api-error-the-objectcontent1-type-failed-to-serialize-the-response-body

 https://docs.microsoft.com/en-us/aspnet/core/migration/31-to-50?view=aspnetcore-5.0&tabs=visual-studio#update-the-target-framework


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM