zoukankan      html  css  js  c++  java
  • .NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法

    方式一 使用二进制

     4 public static class ObjectCopier
     5 {
     6     public static T Clone<T>(T source)
     7     {
     8         if (!typeof(T).IsSerializable)
     9         {
    10             throw new ArgumentException("The type must be serializable.", "source");
    11         }
    12 
    13         if (Object.ReferenceEquals(source, null))
    14         {
    15             return default(T);
    16         }
    17 
    18         IFormatter formatter = new BinaryFormatter();
    19         Stream stream = new MemoryStream();
    20         using (stream)
    21         {
    22             formatter.Serialize(stream, source);
    23             stream.Seek(0, SeekOrigin.Begin);
    24             return (T)formatter.Deserialize(stream);
    25         }
    26     }
    27 }

    方式二 使用序列化与反序列化

    public static T CloneJson<T>(this T source)
    {            
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }
    
        var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
        return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
    }

    方式三 使用反射

    public static T DeepCopyByReflect<T>(T obj)
    {
        //如果是字符串或值类型则直接返回
        if (obj is string || obj.GetType().IsValueType) return obj;
        object retval = Activator.CreateInstance(obj.GetType());
        FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
        foreach (FieldInfo field in fields)
        {
            try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
            catch { }
        }
        return (T)retval;
    }

    方式四 使用XML序列化与反序列化

    public static T DeserializeXML<T>(string xmlData) where T:new()
        {
            if (string.IsNullOrEmpty(xmlData))
                return default(T);
    
            TextReader tr = new StringReader(xmlData);
            T DocItms = new T();
            XmlSerializer xms = new XmlSerializer(DocItms.GetType());
            DocItms = (T)xms.Deserialize(tr);
    
            return DocItms == null ? default(T) : DocItms;
        }
    public static T DeserializeXML<T>(string xmlData) where T:new()
        {
            if (string.IsNullOrEmpty(xmlData))
                return default(T);
    
            TextReader tr = new StringReader(xmlData);
            T DocItms = new T();
            XmlSerializer xms = new XmlSerializer(DocItms.GetType());
            DocItms = (T)xms.Deserialize(tr);
    
            return DocItms == null ? default(T) : DocItms;
        }
  • 相关阅读:
    laravel如何自定义一个路由文件
    RGAC-laravel权限管理
    导航栏下划线跟随
    php简单的判断用户登陆
    php判断文件上传的类型
    git 如何删除仓库中的文件
    laravle中config( )函数的使用
    [leetcode] Count and Say
    [leetcode] Sudoku Solver
    [leetcode] Search Insert Position
  • 原文地址:https://www.cnblogs.com/wangdongying/p/12876392.html
Copyright © 2011-2022 走看看