C#序列化与反序列化以及深拷贝浅拷贝方法
生活随笔
收集整理的這篇文章主要介紹了
C#序列化与反序列化以及深拷贝浅拷贝方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于二進制數據流的序列化和反序列化
/// <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;}此時需要序列化的對象必須要聲明為可序列化,只需要在聲明類的同時采用關鍵字Serializable,如下:
| 1 2 3 4 5 6 | [Serializable] public?class?Test { ????public?string?Name {?get;?set; } ????public?int?Age {?get;?set; } } |
以上便可以完成序列化的反序列化的操作。
基于二進制序列化的反序列化的拷貝,C#是基于面型對象的開發語言,自定義聲明的類都是采用引用傳遞的形式,有時候數據的修改對于這種引用傳遞來說并不是我們想要的結果,因此我們需要該對象的一份拷貝。
以下是基于內存序列化的一種方式:
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;}這樣獲取到的拷貝對象跟原來的對象就不是指向同一個地址,這樣操作新的對象也不會影響原來的對象。
還有一種是實現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();總結
以上是生活随笔為你收集整理的C#序列化与反序列化以及深拷贝浅拷贝方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会出现 unreachable stat
- 下一篇: c#中chart绘制曲线,柱状图等