問題描述: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