克隆对象:序列化 - 反序列化是克隆对象的好习惯吗?

时间:2015-03-27 21:17:53

标签: c# clone

我需要在我正在处理的系统的不同部分克隆列表,我想出了以下解决方案,但我仍然关注它的性能我是一直想知道这是否是一个好方法。所以我决定在这里发布它,以便我可以找到与克隆对象的这种方法有关的任何问题或缺陷。如果这是一个不好的举动,我想知道什么是最好的方法。

我的克隆列表的扩展方法:

    public static List<T> Clone<T>(this List<T> input)
    {
        using (System.IO.MemoryStream Mems = new System.IO.MemoryStream())
        {
            XmlSerializer Serializer = new XmlSerializer(typeof(T));
            Serializer.Serialize(Mems, input);
            var Deserialized = Serializer.Deserialize(Mems) as List<T>;
            return Deserialized;
        }
    }

更新:假设T是值类型(始终)

1 个答案:

答案 0 :(得分:-1)

这增加了相当大的性能损失和浪费内存(XML很冗长)。

浅克隆:

public static List<T> Clone<T>(this List<T> input)
{
    return new List<T>(input);
}

深度克隆:

public static List<T> Clone<T>(this List<T> input) where T : ICloneable
{
    var cloned = new List<T>(input.Capacity);
    cloned.AddRange(input.Select(item => (T) item.Clone()));
    return cloned;
}