C#中的二进制序列化和Json序列化
序列化就是把一个对象变成流的形式,方便传输和还原。小弟不才,总结下对二进制序列化和Json序列化的使用:
1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在类定义的前面加Serializable关键字),而且它的父类类型也必须是可序列化的,经过查看发现,Dotnet中很多类型和结构都有这个标记;而Json序列化不用写标记;
2.如果类中某些属性不希望被二进制序列化,加NonSerialized关键字即可,而要二进制序列化的属性的类型必须是可序列化的数据类型;
3.二进制序列化只会对类中的字段(属性)序列化,故序列化时不建议使用自动属性(每次生成的字段都可能不一样,影响反序列化)。
下面是二进制序列化的代码:
1.要序列化的类的定义:
[Serializable]
public class Person
{
private string _sName; public string SName
{
get { return _sName; }
set { _sName = value; }
} private int _iAge; public int IAge
{
get { return _iAge; }
set { _iAge = value; }
} private string _sEmail; public string SEmail
{
get { return _sEmail; }
set { _sEmail = value; }
} private string _sPhone; public string SPhone
{
get { return _sPhone; }
set { _sPhone = value; }
} private string _sAddress; public string SAddress
{
get { return _sAddress; }
set { _sAddress = value; }
} private string _sSex; public string SSex
{
get { return _sSex; }
set { _sSex = value; }
} private Car _myCar; public Car MyCar
{
get { return _myCar; }
set { _myCar = value; }
} public Person()
{ } public Person(string name,int age,string sex,string email,string phone,string address,Car car):this()
{
this.SName = name;
this.IAge = age;
this.SSex = sex;
this.SEmail = email;
this.SPhone = phone;
this.SAddress = address;
this.MyCar = car;
}
}
[Serializable]
public class Car
{
private string _sCarType; public string SCarType
{
get { return _sCarType; }
set { _sCarType = value; }
} private string _sCarNum; public string SCarNum
{
get { return _sCarNum; }
set { _sCarNum = value; }
} public Car()
{ } public Car(string carType,string carNum):this()
{
this.SCarType = carType;
this.SCarNum = carNum;
}
}
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两个文件拷贝进来,并添加对程序集的引用,二进制反序列化很简单,代码如下:
BinaryFormatter bf = new BinaryFormatter();
string strPath = ConfigurationManager.AppSettings["FilePath"];
StringBuilder sb = new StringBuilder(); using (FileStream fsRead=new FileStream(strPath,FileMode.Open,FileAccess.Read))
{
Person p1 = bf.Deserialize(fsRead) as Person;
if (p1!=null)
{
Car c1 = p1.MyCar;
if (c1!=null)
{
//登记了车的信息
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);
}
else
{
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);
}
}
}
lbResult.Text = sb.ToString();
再来说说Json序列化,先上代码:
Console.WriteLine("请输入您的姓名:");
string sName = Console.ReadLine();
if (!string.IsNullOrEmpty(sName))
{
Console.WriteLine("{0},请输入你的年龄:",sName);
int iAge = int.Parse(Console.ReadLine());
Console.WriteLine("{0},请输入你的性别:",sName);
string sSex = Console.ReadLine();
Console.WriteLine("{0},请输入你的E-Mail地址:",sName);
string sEmail = Console.ReadLine();
Console.WriteLine("{0},请输入你的联系电话:",sName);
string sPhone = Console.ReadLine();
Console.WriteLine("{0},请输入你的通信地址:",sName);
string sAddress = Console.ReadLine();
Person p = new Person(sName, iAge, sSex, sEmail, sPhone, sAddress);
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
//执行Json序列化
File.WriteAllText("demo.txt", jsSerializer.Serialize(p));
Console.WriteLine("Json序列化完毕");
Json序列化好的数据是一对大括号括起来的,每个数据由属性名和值中间加个“:”组成。
Json反序列化一样很简单,同理,也需要将序列化程序集中的.exe和.pdb两个文件拷贝进来,并添加对程序集的引用,代码如下:
Json反序列化
string sPath = ConfigurationManager.AppSettings["FilePath"];
string sContent = File.ReadAllText(sPath, Encoding.UTF8); JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
//这里使用泛型方法可以避免类型转换,方便使用!
Person p1 = jsSerializer.Deserialize<Person>(sContent);
Console.WriteLine("姓名:" + p1.SName);
Console.WriteLine("性别:"+p1.SSex);
Console.WriteLine("年龄:"+p1.IAge.ToString());
Console.WriteLine("联系电话:"+p1.SPhone);
Console.WriteLine("E-mail:"+p1.SEmail);
Console.WriteLine("联系地址:"+p1.SAddress);
Console.ReadKey();
最后说一下今天我在做Json序列化时,遇到的一个问题:在写出类名JavaScriptSerializer后怎么都无法引用(类名也不会变蓝色),在网上查了下,终于找到方法(我用的是Visual Studio 2010,2012也不行):
首先在项目上右击“属性”,如果目标框架是:.net framework 4 Client profile的,自然引用不了,要改成正式版,即选不带后缀(不带Client profile的),更改后项目中自然多了一个app.config项目配置文件,再引用System.web.Extensions这个程序集。问题即可解决。
C#中的二进制序列化和Json序列化的更多相关文章
- Atitit php序列化 php的serialize序列化和json序列化
Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...
- Python常用标准库(pickle序列化和JSON序列化)
常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中 ...
- SpringBoot中使用Fastjson/Jackson对JSON序列化格式化输出的若干问题
来源 :https://my.oschina.net/Adven/blog/3036567 使用springboot-web编写rest接口,接口需要返回json数据,目前国内比较常用的fastjso ...
- Scala中使用 Jackson API 进行JSON序列化和反序列化
1. 什么是 Json 序列化 和 反序列化 序列化 => 将 Java对象 转换成 json字符串反序列化 => 将 json字符串 转换成 Java对象 2. 依赖包 说明 < ...
- C# 序列化详解,xml序列化,json序列化对比
本文讲讲一些纯技术的东西.并且讲讲一些原理性的东西,和一般的百度的文章不一致,如果你对序列化不清楚,绝对可以很有收获. 技术支持QQ群(主要面向工业软件及HSL组件的):592132877 (组件的 ...
- 关于spring中请求返回值的json序列化/反序列化问题
https://cloud.tencent.com/developer/article/1381083 https://www.jianshu.com/p/db07543ffe0a 先留个坑
- json序列化NULL
在项目中遇到一问题,json序列化需要将null传递给前端,但之前项目中使用的都是fastjson的JSONObject.toJSONString(vo),这样会过滤掉为NULL的属性. 解决办法: ...
- Newtonsoft.Json序列化字符串-格式化
转自:https://blog.csdn.net/wlphlj/article/details/51982866最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json publi ...
- Newtonsoft.Json序列化字符串-格式化和时间格式问题
最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson() { DataTable d ...
随机推荐
- NOSQL之旅---HBase
最近因为项目原因,研究了Cassandra,Hbase等几个NoSQL数据库,最终决定采用HBase.在这里,我就向大家分享一下自己对HBase的理解. 在说HBase之前,我想再唠叨几句.做互联网应 ...
- JS基础DOM篇之二:DOM级别与节点层次?
通过上一篇我们大致了解了什么是DOM,今天我们继续深入了解. 1.DOM级别 在大家阅读DOM标准的时候,可能会看到DOM(0/1/2/3)级的字眼,这就是DOM级别.但实际上,DOM0级 ...
- mysql数据库表间内外链接详解
1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: ...
- UML图示
来源: http://www.uml.org.cn/oobject/200901041.asp 近些天学习设计.由于没有具体项目,原有项目也没有什么设计的概念,只是看相关的书籍,所以着实有些抓狂.然最 ...
- java泛型的讲解
java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...
- URAL 1776 C - Anniversary Firework DP
C - Anniversary FireworkTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/c ...
- delphi 插入 HTML代码 播放器
Delphi在Webbrowser中插入 HTML/java script代码 使用方法将下面的代码赋值到1个记事本里保存,然后保存为xxx.htm就可以看到效果使用PasteHtml实现功能 的事件 ...
- DB9 公头母头引脚定义及连接
1.实物及引脚简单介绍 在做开发的时候常常会用到串行接口,一般9针的串行接口居多.例如以下图所看到的: 公头母头用于连接线的採用上图封装.但用于开发板的时候採用90度弯角插针的封装.例如以下图: 各引 ...
- 模式识别 - 处理多演示样例学习(MIL)特征(matlab)
处理多演示样例学习(MIL)特征(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习( ...
- ANE在ios上的使用流程和问题解决
编写ANE流程: 1. 在xcode里编写.a原生类库 2. 更改配置文件extension.xml, 定义了原生程序的扩展接口 3. 编写AS替身类,生成扩展类包.swc,解压再得到library. ...