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

