用序列化實(shí)現(xiàn)List<T> 實(shí)例的深復(fù)制(推薦)
如果 List<T> 里的 T 是引用類(lèi)型(如myClass類(lèi)),則在 像這種寫(xiě)法:
List<myClass> lists1 = new List<myClass>() { new myClass(), new myClass() };
List<myClass> lists2 = new List<myClass>(lists1 );
其實(shí)是一個(gè)淺復(fù)制的過(guò)程。
如果要實(shí)現(xiàn)深復(fù)制,通過(guò)有幾種做法,可以用foreach, 或者重寫(xiě)Clone()方法。
但最好用和最方便的方法還是使用【序列化】的方式來(lái)實(shí)現(xiàn)。
序列化是指將對(duì)象轉(zhuǎn)換為字節(jié)流的形式,然后保存在內(nèi)存或者數(shù)據(jù)庫(kù)中。序列化可以保存對(duì)象的狀態(tài)信息,當(dāng)需要使用的時(shí)候在反序列化回來(lái)。所以將對(duì)象序列化可以存儲(chǔ)和交換數(shù)據(jù)。例如如果web 服務(wù)發(fā)送,或者在應(yīng)用程序從這個(gè)域發(fā)送到另一個(gè)域。
若要序列化對(duì)象,您需要待序列化的對(duì)象、要包含序列化對(duì)象的流,以及一個(gè)Formatter。序列化包括:二進(jìn)制序列化和 xml 序列化。
例如,使用 XmlSerializer ,將要拷貝的對(duì)象序列化到流中,然后通過(guò)反序列化得到新的對(duì)象。
/// <summary> /// 序列化類(lèi) /// </summary> public class SerializLog { //1.使用序列化的方式完成 引用對(duì)象的 深復(fù)制 是最好的方式 //2.下面的 Clone方法,我需要使用 泛型對(duì)象 做為參數(shù),則在 Clone后面需要帶上<T>的聲明,否則編譯出錯(cuò) public static T Clone<T>(T realObject) // T 要序列化的對(duì)象 { using (Stream stream = new MemoryStream()) // 初始化一個(gè) 流對(duì)象 { XmlSerializer serializer = new XmlSerializer(typeof(T)); //將要序列化的對(duì)象序列化到xml文檔(Formatter) serializer.Serialize(stream, realObject); //將序列后的對(duì)象寫(xiě)入到流中 stream.Seek(0, SeekOrigin.Begin); return (T)serializer.Deserialize(stream);// 反序列化得到新的對(duì)象 } } }
以上這篇用序列化實(shí)現(xiàn)List
相關(guān)文章
用幾行C#代碼實(shí)現(xiàn)定時(shí)關(guān)機(jī)/重啟(超詳細(xì)!建議新手練習(xí))
有很多的軟件都實(shí)現(xiàn)了自動(dòng)關(guān)機(jī)這樣的功能,下面這篇文章主要給大家介紹了關(guān)于利用幾行C#代碼實(shí)現(xiàn)定時(shí)關(guān)機(jī)/重啟的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12C#中讓控件全屏顯示的實(shí)現(xiàn)代碼(WinForm)
有時(shí)候需要讓窗口中某一塊的內(nèi)容全屏顯示,比如視頻播放、地圖等等。經(jīng)過(guò)摸索,暫時(shí)發(fā)現(xiàn)兩種可行方法,如果有誰(shuí)知道其他方法,敬請(qǐng)告知2012-04-04C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái)的操作方法
這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái),上傳視頻功能,主要要解決兩個(gè)問(wèn)題,一是在服務(wù)端通過(guò)C#生成簽名和SDKID,二是在客戶端通過(guò)JavaScript上傳視頻到騰訊云點(diǎn)播服務(wù)器,感興趣的朋友跟隨小編一起看看吧2023-11-11C#對(duì)Windows服務(wù)組的啟動(dòng)與停止操作
這篇文章主要為大家詳細(xì)介紹了C#對(duì)Windows服務(wù)組的啟動(dòng)與停止操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03UGUI ScrollRect實(shí)現(xiàn)帶按鈕翻頁(yè)支持拖拽
這篇文章主要為大家詳細(xì)介紹了UGUI ScrollRect實(shí)現(xiàn)帶按鈕翻頁(yè)支持拖拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05C#實(shí)現(xiàn)的序列化通用類(lèi)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的序列化通用類(lèi),實(shí)例分析了C#序列化與反序列化操作相關(guān)技巧,需要的朋友可以參考下2015-04-04淺析C#中g(shù)oto跳轉(zhuǎn)語(yǔ)句的用法
在我們?nèi)粘9ぷ髦谐S玫腃#跳轉(zhuǎn)語(yǔ)句有break、continue、return,但是還有一個(gè)C#跳轉(zhuǎn)語(yǔ)句很多同學(xué)可能都比較的陌生就是goto,下面我們就來(lái)看看goto跳轉(zhuǎn)語(yǔ)句的用法吧2024-03-03winform使用委托和事件來(lái)完成兩個(gè)窗體之間通信的實(shí)例
這篇文章介紹了winform使用委托和事件來(lái)完成兩個(gè)窗體之間通信的實(shí)例,有需要的朋友可以參考一下2013-09-09