C#序列化与反序列化以及深拷贝浅拷贝方法
生活随笔
收集整理的這篇文章主要介紹了
C#序列化与反序列化以及深拷贝浅拷贝方法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
基于二進制數(shù)據(jù)流的序列化和反序列化
/// <summary>/// 序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>public static void Serialize<T>(T obj){try{using (FileStream fs = new FileStream("Serialize.bin", FileMode.OpenOrCreate)){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fs, obj);//序列化}}catch (Exception ex){throw;}}/// <summary>/// /// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static T Deserialize<T>(){T res = default(T);try{using (FileStream fs=new FileStream("Serialize.bin",FileMode.Open)){BinaryFormatter bf = new BinaryFormatter();res = (T)bf.Deserialize(fs);}}catch (Exception){throw;}return res;}此時需要序列化的對象必須要聲明為可序列化,只需要在聲明類的同時采用關(guān)鍵字Serializable,如下:
| 1 2 3 4 5 6 | [Serializable] public?class?Test { ????public?string?Name {?get;?set; } ????public?int?Age {?get;?set; } } |
以上便可以完成序列化的反序列化的操作。
基于二進制序列化的反序列化的拷貝,C#是基于面型對象的開發(fā)語言,自定義聲明的類都是采用引用傳遞的形式,有時候數(shù)據(jù)的修改對于這種引用傳遞來說并不是我們想要的結(jié)果,因此我們需要該對象的一份拷貝。
以下是基于內(nèi)存序列化的一種方式:
public static T Copy<T>(T obj){if (obj == null){return default(T);}T res = default(T);using (MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, obj);//序列化ms.Seek(0, SeekOrigin.Begin);res = (T)bf.Deserialize(ms);//反序列化}return res;}這樣獲取到的拷貝對象跟原來的對象就不是指向同一個地址,這樣操作新的對象也不會影響原來的對象。
還有一種是實現(xiàn)ICloneable接口,在Clone方法中返回對象的一個淺拷貝MemberwiseClone。
public class CopyTest : ICloneable{public string Name { get; set; }public int Age { get; set; }public object Clone(){return this.MemberwiseClone();//獲取副本}}通過以下方式便可以獲得對象的一個拷貝對象:
CopyTest ct = new CopyTest() { Name = "Test", Age = 99 }; CopyTest ct01 = (CopyTest)ct.Clone();總結(jié)
以上是生活随笔為你收集整理的C#序列化与反序列化以及深拷贝浅拷贝方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会出现 unreachable stat
- 下一篇: Docker 下载 JDK 镜像(doc