如何实现对象的深copy?

咨询区

  • NakedBrunch

我的项目中有一个对象copy的需求,比如下面这段代码:


MyObject myObj = GetMyObj(); // Create and fill a new object
MyObject newObj = myObj.Clone();

这段代码有一点问题,那就是对 newobj 进行的任何修改都会作用到 myobj 上,我不想这样,我想实现那种深copy,我目前的做法是重新new一个对象,然后逐一将老对象的属性赋值给新对象,虽然是可以实现,但我觉得应该有更简单方便的做法?

回答区

  • Michael Cox

如果你不介意使用第三方工具,可以参考下  ValueInjecterAutoMapper,它可以完美的实现你的需求,参考如下代码:


MyObject oldObj; // The existing object to clone

MyObject newObj = new MyObject();

newObj.InjectFrom(oldObj); // Using ValueInjecter syntax

用这些第三方工具,你就不需要像传统那样copy了,也避免了 model 需实现 ISerializable 或 ICloneable  接口的尴尬,其实这是 MVC/MVVM 开发模式下的 DTO 通用做法。

  • johnc

你可以使用 JSON.NET 去实现,它可以非常轻量级的实现,不需要让你的类打上[Serializable]标记,参考如下代码:


public static T CloneJson<T>(this T source)
{            
    // Don't serialize a null object, simply return the default for that object
    if (ReferenceEquals(source, null)) return default;

    var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};

    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}

  • Michael White

我也碰到了这种问题,我觉得序列化是一条路,这里我把它序列化为xml,参考如下:


static public class SerializeHelper
{
    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 string SeralizeObjectToXML<T>(T xmlObject)
    {
        StringBuilder sbTR = new StringBuilder();
        XmlSerializer xmsTR = new XmlSerializer(xmlObject.GetType());
        XmlWriterSettings xwsTR = new XmlWriterSettings();

        XmlWriter xmwTR = XmlWriter.Create(sbTR, xwsTR);
        xmsTR.Serialize(xmwTR,xmlObject);

        return sbTR.ToString();
    }

    public static T CloneObject<T>(T objClone) where T:new()
    {
        string GetString = SerializeHelper.SeralizeObjectToXML<T>(objClone);
        return SerializeHelper.DeserializeXML<T>(GetString);
    }
}

点评区

相信深copy在各位项目开发中是必然会遇到的问题,我在很长一段时间内都是使用 JSON.NET 去实现,就像 johnc 大佬提供的代码一样,简单粗暴,同时三位大佬都提供了相应方法,这里学习了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值