用序列化實(shí)現(xiàn)List<T> 實(shí)例的深復(fù)制(推薦)
如果 List<T> 里的 T 是引用類型(如myClass類),則在 像這種寫法:
List<myClass> lists1 = new List<myClass>()
{
new myClass(),
new myClass()
};
List<myClass> lists2 = new List<myClass>(lists1 );
其實(shí)是一個(gè)淺復(fù)制的過程。
如果要實(shí)現(xiàn)深復(fù)制,通過有幾種做法,可以用foreach, 或者重寫Clone()方法。
但最好用和最方便的方法還是使用【序列化】的方式來實(shí)現(xiàn)。
序列化是指將對象轉(zhuǎn)換為字節(jié)流的形式,然后保存在內(nèi)存或者數(shù)據(jù)庫中。序列化可以保存對象的狀態(tài)信息,當(dāng)需要使用的時(shí)候在反序列化回來。所以將對象序列化可以存儲和交換數(shù)據(jù)。例如如果web 服務(wù)發(fā)送,或者在應(yīng)用程序從這個(gè)域發(fā)送到另一個(gè)域。
若要序列化對象,您需要待序列化的對象、要包含序列化對象的流,以及一個(gè)Formatter。序列化包括:二進(jìn)制序列化和 xml 序列化。
例如,使用 XmlSerializer ,將要拷貝的對象序列化到流中,然后通過反序列化得到新的對象。
/// <summary>
/// 序列化類
/// </summary>
public class SerializLog
{
//1.使用序列化的方式完成 引用對象的 深復(fù)制 是最好的方式
//2.下面的 Clone方法,我需要使用 泛型對象 做為參數(shù),則在 Clone后面需要帶上<T>的聲明,否則編譯出錯(cuò)
public static T Clone<T>(T realObject) // T 要序列化的對象
{
using (Stream stream = new MemoryStream()) // 初始化一個(gè) 流對象
{
XmlSerializer serializer = new XmlSerializer(typeof(T)); //將要序列化的對象序列化到xml文檔(Formatter)
serializer.Serialize(stream, realObject); //將序列后的對象寫入到流中
stream.Seek(0, SeekOrigin.Begin);
return (T)serializer.Deserialize(stream);// 反序列化得到新的對象
}
}
}
以上這篇用序列化實(shí)現(xiàn)List
相關(guān)文章
C#最簡單的關(guān)閉子窗體更新父窗體的實(shí)現(xiàn)方法
原理就是將子窗體最為對話框模式彈出,當(dāng)窗體關(guān)閉或取消時(shí)更新主窗體2012-11-11
C#操作Byte數(shù)組和十六進(jìn)制進(jìn)行互轉(zhuǎn)
這篇文章介紹了C#操作Byte數(shù)組和十六進(jìn)制進(jìn)行互轉(zhuǎn)的的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Unity實(shí)現(xiàn)答題系統(tǒng)的示例代碼
這篇文章主要和大家分享了利用Unity制作一個(gè)答題系統(tǒng)的示例代碼,文中的實(shí)現(xiàn)方法講解詳細(xì),對我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2022-05-05
Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換
這篇文章主要介紹了Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換的示例代碼,幫助大家更好的理解和使用winform開發(fā),感興趣的朋友可以了解下2020-12-12
c#將list類型轉(zhuǎn)換成DataTable方法示例
將List類型轉(zhuǎn)換成DataTable的通用方法,大家參考使用吧2013-12-12

