首页 / C# / C#中的二进制序列化和Json序列化
C#中的二进制序列化和Json序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中的二进制序列化和Json序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5179字,纯文字阅读大概需要8分钟。
内容图文
序列化就是把一个对象变成流的形式,方便传输和还原。小弟不才,总结下对二进制序列化和Json序列化的使用:
1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在类定义的前面加Serializable关键字),而且它的父类类型也必须是可序列化的,经过查看发现,Dotnet中很多类型和结构都有这个标记;而Json序列化不用写标记;
2.如果类中某些属性不希望被二进制序列化,加NonSerialized关键字即可,而要二进制序列化的属性的类型必须是可序列化的数据类型;
3.二进制序列化只会对类中的字段(属性)序列化,故序列化时不建议使用自动属性(每次生成的字段都可能不一样,影响反序列化)。
下面是二进制序列化的代码:
1.要序列化的类的定义:
1 [Serializable] 2 public class Person 3 { 4 private string _sName; 5 6 public string SName 7 { 8 get { return _sName; } 9set { _sName = value; } 10 } 11 12privateint _iAge; 13 14publicint IAge 15 { 16get { return _iAge; } 17set { _iAge = value; } 18 } 19 20privatestring _sEmail; 21 22publicstring SEmail 23 { 24get { return _sEmail; } 25set { _sEmail = value; } 26 } 27 28privatestring _sPhone; 29 30publicstring SPhone 31 { 32get { return _sPhone; } 33set { _sPhone = value; } 34 } 35 36privatestring _sAddress; 37 38publicstring SAddress 39 { 40get { return _sAddress; } 41set { _sAddress = value; } 42 } 43 44privatestring _sSex; 45 46publicstring SSex 47 { 48get { return _sSex; } 49set { _sSex = value; } 50 } 51 52private Car _myCar; 53 54public Car MyCar 55 { 56get { return _myCar; } 57set { _myCar = value; } 58 } 59 60public Person() 61 { 62 63 } 64 65public Person(string name,int age,string sex,string email,string phone,string address,Car car):this() 66 { 67this.SName = name; 68this.IAge = age; 69this.SSex = sex; 70this.SEmail = email; 71this.SPhone = phone; 72this.SAddress = address; 73this.MyCar = car; 74 } 75 } 76 [Serializable] 77publicclass Car 78 { 79privatestring _sCarType; 80 81publicstring SCarType 82 { 83get { return _sCarType; } 84set { _sCarType = value; } 85 } 86 87privatestring _sCarNum; 88 89publicstring SCarNum 90 { 91get { return _sCarNum; } 92set { _sCarNum = value; } 93 } 94 95public Car() 96 { 97 98 } 99100public Car(string carType,string carNum):this() 101 { 102this.SCarType = carType; 103this.SCarNum = carNum; 104 } 105 }
2.二进制序列化代码:
BinaryFormatter bf = new BinaryFormatter(); Person p = null; using (FileStream fsWrite=new FileStream("person.bin",FileMode.Create,FileAccess.Write)) { if (ckbIsCar.Checked) { var strCarNum = txtCarNum.Text.Trim(); var strCarType = txtCarType.Text.Trim(); Car c1=new Car(strCarType,strCarNum); p = new Person(strName, intAge,strSex, strEmail, strPhone, strAddress, c1); } else { //不登记车的情况 p = new Person(strName, intAge,strSex, strEmail, strPhone, strAddress, null); } //二进制序列化 bf.Serialize(fsWrite, p); MessageBox.Show("对象序列化完毕");
在进行二进制反序列化(还原对象时),需要将序列化程序集中的.exe和.pdb两个文件拷贝进来,并添加对程序集的引用,二进制反序列化很简单,代码如下:
1 BinaryFormatter bf = new BinaryFormatter(); 2string strPath = ConfigurationManager.AppSettings["FilePath"]; 3 StringBuilder sb = new StringBuilder(); 4 5using (FileStream fsRead=new FileStream(strPath,FileMode.Open,FileAccess.Read)) 6 { 7 Person p1 = bf.Deserialize(fsRead) as Person; 8if (p1!=null) 9 { 10 Car c1 = p1.MyCar; 11if (c1!=null) 12 { 13//登记了车的信息14 sb.AppendFormat("姓名:{0};\r\n年龄:{1}岁;\r\n性别:{2};\r\n联系电话:{3};\r\n电子邮箱:{4};\r\n联系地址:{5};\r\n车型:{6};\r\n车牌号:{7}。", p1.SName, p1.IAge, p1.SSex, p1.SPhone, p1.SEmail, p1.SAddress, c1.SCarType, c1.SCarNum); 15 } 16else17 { 18 sb.AppendFormat("姓名:{0};\r\n年龄:{1}岁;\r\n性别:{2};\r\n联系电话:{3};\r\n电子邮箱:{4};\r\n联系地址:{5}。", p1.SName, p1.IAge, p1.SSex, p1.SPhone, p1.SEmail, p1.SAddress); 19 } 20 } 21 } 22 lbResult.Text = sb.ToString();
再来说说Json序列化,先上代码:
1 Console.WriteLine("请输入您的姓名:"); 2string sName = Console.ReadLine(); 3if (!string.IsNullOrEmpty(sName)) 4 { 5 Console.WriteLine("{0},请输入你的年龄:",sName); 6int iAge = int.Parse(Console.ReadLine()); 7 Console.WriteLine("{0},请输入你的性别:",sName); 8string sSex = Console.ReadLine(); 9 Console.WriteLine("{0},请输入你的E-Mail地址:",sName); 10string sEmail = Console.ReadLine(); 11 Console.WriteLine("{0},请输入你的联系电话:",sName); 12string sPhone = Console.ReadLine(); 13 Console.WriteLine("{0},请输入你的通信地址:",sName); 14string sAddress = Console.ReadLine(); 1516 Person p = new Person(sName, iAge, sSex, sEmail, sPhone, sAddress); 17 JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 18//执行Json序列化19 File.WriteAllText("demo.txt", jsSerializer.Serialize(p)); 20 Console.WriteLine("Json序列化完毕");
Json序列化好的数据是一对大括号括起来的,每个数据由属性名和值中间加个“:”组成。
Json反序列化一样很简单,同理,也需要将序列化程序集中的.exe和.pdb两个文件拷贝进来,并添加对程序集的引用,代码如下:
Json反序列化
1 string sPath = ConfigurationManager.AppSettings["FilePath"]; 2string sContent = File.ReadAllText(sPath, Encoding.UTF8); 3 4 JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 5//这里使用泛型方法可以避免类型转换,方便使用! 6 Person p1 = jsSerializer.Deserialize<Person>(sContent); 7 Console.WriteLine("姓名:" + p1.SName); 8 Console.WriteLine("性别:"+p1.SSex); 9 Console.WriteLine("年龄:"+p1.IAge.ToString()); 10 Console.WriteLine("联系电话:"+p1.SPhone); 11 Console.WriteLine("E-mail:"+p1.SEmail); 12 Console.WriteLine("联系地址:"+p1.SAddress); 13 Console.ReadKey();
最后说一下今天我在做Json序列化时,遇到的一个问题:在写出类名JavaScriptSerializer后怎么都无法引用(类名也不会变蓝色),在网上查了下,终于找到方法(我用的是Visual Studio 2010,2012也不行):
首先在项目上右击“属性”,如果目标框架是:.net framework 4 Client profile的,自然引用不了,要改成正式版,即选不带后缀(不带Client profile的),更改后项目中自然多了一个app.config项目配置文件,再引用System.web.Extensions这个程序集。问题即可解决。
原文:http://www.cnblogs.com/chens2865/p/4551828.html
内容总结
以上是互联网集市为您收集整理的C#中的二进制序列化和Json序列化全部内容,希望文章能够帮你解决C#中的二进制序列化和Json序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。