栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法

一 、使用二进制流
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

/// 
/// 参考 http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// 
public static class ObjectCopier
{
    public static T Clone(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

二、使用序列化与反序列化
public static T CloneJson(this T source)
{            
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
    return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source), deserializeSettings);
}

三、使用反射
public static T DeepCopyByReflect(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(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;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909596.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号