<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
將物件及其狀態儲存起來,通常是儲存到檔案中,叫序列化。
將檔案還原為物件,叫反序列化。
Simple Object Access Protocol,簡單物件存取協定,基於XML協定。
using System; using System.Data.SqlClient; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; class Program { static void Main(string[] args) { IFormatter formatter = new BinaryFormatter(); Product product = new Product(1){Price = 88.5f,Name = "Wind 850"}; Stream fs = File.OpenWrite(@"F:product.obj"); formatter.Serialize(fs, product); fs.Dispose(); Console.WriteLine(product); Console.ReadKey(); } } [Serializable] public class Product { private int id; [NonSerialized] private SqlConnection conn; public Product(int id) { this.id = id; this.conn = new SqlConnection(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=1"); } public string Name { get; set; } public double Price { get; set; } public override string ToString() { return String.Format("Id:{0},Name:{1},Price:{2},conn:{3}", this.id, this.Name, this.Price,this.conn==null?"Null":"Object"); } }
注意:
結果:
IFormatter formatter = new BinaryFormatter(); Stream fs = File.OpenRead(@"F:product.obj"); Product product = (Product) formatter.Deserialize(fs); Console.WriteLine(product); Console.ReadKey();
結果:
注意:
[Serializable] public class Product:IDeserializationCallback { private int id; [NonSerialized] private SqlConnection conn; public Product(int id) { this.id = id; this.conn = new SqlConnection(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=1"); } public string Name { get; set; } public double Price { get; set; } public override string ToString() { return String.Format("Id:{0},Name:{1},Price:{2},conn:{3}", this.id, this.Name, this.Price,this.conn==null?"Null":"Object"); } public void OnDeserialization(object sender) { this.conn = new SqlConnection(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=1"); } }
再次執行,得到:
IFormatter formatter = new SoapFormatter(); Product item = new Product(2){Name = "Hello world",Price = 9.5F}; Stream fs = File.OpenWrite(@"F:product.soap"); formatter.Serialize(fs, item); fs.Dispose();
結果:
主程式:
//序列化 IFormatter formatter = new BinaryFormatter(); Product product = new Product(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=1"); Stream fs = File.OpenWrite(@"F:product.obj"); formatter.Serialize(fs, product); fs.Dispose(); //反序列化 Stream fs1 = File.OpenRead(@"F:product.obj"); Product product1 = (Product)formatter.Deserialize(fs1); Console.WriteLine(product1); Console.ReadKey();
可序列化類:
[Serializable] public class Product { private string connString; [NonSerialized] public SqlConnection conn; public Product(string connString) { this.connString = connString; } [OnSerializing] void OnSerializing(StreamingContext context) { Console.WriteLine("序列化前:對私有欄位connString進行簡單加密"); this.connString = this.connString.Replace("a", "*"); } [OnSerialized] void OnSerialized(StreamingContext context) { Console.WriteLine("序列化後:對私有欄位connString進行簡單解密"); this.connString = this.connString.Replace("*", "a"); } [OnDeserializing] void OnDeserializing(StreamingContext context) { Console.WriteLine("反序列化前:do nothing~~"); } [OnDeserialized] void OnDeserialized(StreamingContext context) { Console.WriteLine("反序列化後:對私有欄位connString進行簡單解密,並重新初始化非序列化欄位"); this.connString = this.connString.Replace("*", "a"); this.conn = new SqlConnection(connString); } public override string ToString() { return this.connString; } }
結果:
主要藉助幫助類SerializationInfo,以鍵值對形式把需要序列化的欄位或屬性儲存在SerializationInfo中。另外,還需要一個反序列化時用於還原屬性值的建構函式。
[Serializable] public class Product : ISerializable { private string connString; [NonSerialized] public SqlConnection conn; public Product(string connString) { this.connString = connString; } //反序列化時用於還原屬性值的建構函式 protected Product(SerializationInfo info, StreamingContext context) { string encrypted = info.GetString("encrypted"); this.connString = encrypted.Replace("*", "a"); } //對私有欄位簡單加密以鍵值對形式儲存到SerializationInfo public void GetObjectData(SerializationInfo info, StreamingContext context) { string encrypted = this.connString.Replace("a", "*"); info.AddValue("encrypted",encrypted); } public override string ToString() { return this.connString; } }
結果:
有這樣一個基礎類別,不可以序列化。
public class ObjectBase { public string Name; }
建立一個子類繼承不可以序列化的ObjectBase,並實現ISerializable介面。
[Serializable] public class Product : ObjectBase,ISerializable { private string connString; [NonSerialized] public SqlConnection conn; public Product(string connString) { this.connString = connString; } //反序列化時用於還原屬性值的建構函式 protected Product(SerializationInfo info, StreamingContext context) { string encrypted = info.GetString("encrypted"); this.connString = encrypted.Replace("*", "a"); base.Name = info.GetString("name"); } //對私有欄位簡單加密以鍵值對形式儲存到SerializationInfo public void GetObjectData(SerializationInfo info, StreamingContext context) { string encrypted = this.connString.Replace("a", "*"); info.AddValue("encrypted",encrypted); info.AddValue("name",base.Name); } public override string ToString() { return String.Format("Name:{0},Conn:{1}", base.Name, this.connString); } }
主程式:
//序列化 IFormatter formatter = new BinaryFormatter(); Product product = new Product(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=1"){Name = "我來自基礎類別"}; Stream fs = File.OpenWrite(@"F:product.obj"); formatter.Serialize(fs, product); fs.Dispose(); //反序列化 Stream fs1 = File.OpenRead(@"F:product.obj"); Product product1 = (Product)formatter.Deserialize(fs1); Console.WriteLine(product1); Console.ReadKey();
結果:
到此這篇關於C#序列化和反序列化物件的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45