zoukankan      html  css  js  c++  java
  • .net core5.0下对象克隆_借用XmlSerializer序列化器_替换传统的BinaryFormatter器

      前言:传统的对象克隆在.net core5.0下已经不推荐了,微软给的解释是存在安全漏洞,其提供了几个替代类,其中就包括:XmlSerializer。

      核心克隆代码:

    /// <summary>
    /// 将一个实体对象的值复制到另一个对象
    /// </summary>
    public static class ObjectExtensions
    {
        /// <summary>
        /// 对象克隆
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T Clone<T>(this T obj) where T : class
        {
            T clone = default(T);
    
            //核心点1:BinaryFormatter在.net 5.0下存在安全漏洞已不推荐使用且报异常。
            //参考链接:https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/binaryformatter-security-guide
    
            //using (MemoryStream ms = new MemoryStream(1024))
            //{
            //    BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
            //    binaryFormatter.Serialize(ms, obj);
            //    ms.Seek(0, SeekOrigin.Begin);
            //    // 反序列化至另一个对象(即创建了一个原对象的深表副本)
            //    clone = (T)binaryFormatter.Deserialize(ms);
            //}
    
            //核心点2:这里的XmlSerializer序列化器要使用实例obj的类型,不能直接使用类型T,否则会报异常(当obj实例为T类型的子类时,可重现该异常)
            //异常详细信息:"ClassName":"System.InvalidOperationException","Message":"There was an error generating the XML document.","Data":null,"InnerException":{"ClassName":"System.InvalidOperationException","Message":"The type MeShopPay.View.API.Models.ConfigModel.CallBackSettingPayPal was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."
            System.Xml.Serialization.XmlSerializer tXmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(1024))
            {
                tXmlSerializer.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                // 反序列化至另一个对象(即创建了一个原对象的深表副本)
                clone = (T)tXmlSerializer.Deserialize(ms);
            }
    
            return clone;
        }
    }
    *感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神 支持是博主强大的写作动力。欢迎转载!
    *博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
    *我的博客: http://www.cnblogs.com/lxhbky/
  • 相关阅读:
    .html(),.text()和.val()的差异
    jQuery选取表单元素
    jquery中动画特效方法
    js正则函数match、exec、test、search、replace、split使用介绍集合
    关于LDA的几何表示——MATLAB实现
    关于PCA的几何表示——MATLAB实现
    简单的线性分类——MATLAB,python3实现
    关于KNN的python3实现
    拔靴法--Bootstrap--R语言实现
    Poisson Distribution——泊松分布
  • 原文地址:https://www.cnblogs.com/lxhbky/p/14783169.html
Copyright © 2011-2022 走看看