使用序列化实现List
什么是深复制
深复制是指复制对象时,每个对象都会被单独复制一份,这两份对象完全独立而相互没有影响。这与浅复制不同,浅复制只是把对象的引用复制一份,这样两个对象会共用同一个引用,从而相互影响。
使用序列化实现深复制
针对List
1. 定义待复制的List实例
首先,定义待复制的List实例,例如:
List<int> originalList = new List<int>{ 1, 2, 3, 4 };
2. 序列化原始实例
将待复制的List实例序列化为二进制流:
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, originalList);
3. 反序列化复制实例
将序列化后的二进制流反序列化为新的List实例:
stream.Seek(0, SeekOrigin.Begin);
List<int> copiedList = formatter.Deserialize(stream) as List<int>;
4. 验证复制结果
最后,可以验证复制结果:
Console.WriteLine(originalList[0]); // 输出 1
Console.WriteLine(copiedList[0]); // 输出 1
originalList[0] = 10;
Console.WriteLine(originalList[0]); // 输出 10
Console.WriteLine(copiedList[0]); // 输出 1
从上述代码可以看出,复制后的List实例与原始实例完全独立,互相没有影响,实现了深复制的效果。
示例1
下面是一个稍微复杂一些的实例,演示如何深复制包含自定义类的List实例:
public class MyClass
{
public int Value { get; set; }
}
List<MyClass> originalList = new List<MyClass>
{
new MyClass{ Value = 1 },
new MyClass{ Value = 2 },
new MyClass{ Value = 3 },
};
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, originalList);
stream.Seek(0, SeekOrigin.Begin);
List<MyClass> copiedList = formatter.Deserialize(stream) as List<MyClass>;
Console.WriteLine(originalList[0].Value); // 输出 1
Console.WriteLine(copiedList[0].Value); // 输出 1
originalList[0].Value = 10;
Console.WriteLine(originalList[0].Value); // 输出 10
Console.WriteLine(copiedList[0].Value); // 输出 1
示例2
下面是一个多层嵌套的实例,演示如何深复制包含多层嵌套的List实例:
List<List<int>> originalList = new List<List<int>> {
new List<int>{ 1, 2 },
new List<int>{ 3, 4 },
};
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, originalList);
stream.Seek(0, SeekOrigin.Begin);
List<List<int>> copiedList = formatter.Deserialize(stream) as List<List<int>>;
Console.WriteLine(originalList[0][0]); // 输出 1
Console.WriteLine(copiedList[0][0]); // 输出 1
originalList[0][0] = 10;
Console.WriteLine(originalList[0][0]); // 输出 10
Console.WriteLine(copiedList[0][0]); // 输出 1
从上述代码可以看出,即使是包含多层嵌套的List实例也可以通过序列化实现深复制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用序列化实现List