C#中的二进制序列化和Json序列化

序列化就是把一个对象变成流的形式,方便传输和还原。小弟不才,总结下对二进制序列化和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; }
  9             set { _sName = value; }
 10         }
 11
 12         private int _iAge;
 13
 14         public int IAge
 15         {
 16             get { return _iAge; }
 17             set { _iAge = value; }
 18         }
 19
 20         private string _sEmail;
 21
 22         public string SEmail
 23         {
 24             get { return _sEmail; }
 25             set { _sEmail = value; }
 26         }
 27
 28         private string _sPhone;
 29
 30         public string SPhone
 31         {
 32             get { return _sPhone; }
 33             set { _sPhone = value; }
 34         }
 35
 36         private string _sAddress;
 37
 38         public string SAddress
 39         {
 40             get { return _sAddress; }
 41             set { _sAddress = value; }
 42         }
 43
 44         private string _sSex;
 45
 46         public string SSex
 47         {
 48             get { return _sSex; }
 49             set { _sSex = value; }
 50         }
 51
 52         private Car _myCar;
 53
 54         public Car MyCar
 55         {
 56             get { return _myCar; }
 57             set { _myCar = value; }
 58         }
 59
 60         public Person()
 61         {
 62
 63         }
 64
 65         public Person(string name,int age,string sex,string email,string phone,string address,Car car):this()
 66         {
 67             this.SName = name;
 68             this.IAge = age;
 69             this.SSex = sex;
 70             this.SEmail = email;
 71             this.SPhone = phone;
 72             this.SAddress = address;
 73             this.MyCar = car;
 74         }
 75     }
 76     [Serializable]
 77     public class Car
 78     {
 79         private string _sCarType;
 80
 81         public string SCarType
 82         {
 83             get { return _sCarType; }
 84             set { _sCarType = value; }
 85         }
 86
 87         private string _sCarNum;
 88
 89         public string SCarNum
 90         {
 91             get { return _sCarNum; }
 92             set { _sCarNum = value; }
 93         }
 94
 95         public Car()
 96         {
 97
 98         }
 99
100         public Car(string carType,string carNum):this()
101         {
102             this.SCarType = carType;
103             this.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();
 2             string strPath = ConfigurationManager.AppSettings["FilePath"];
 3             StringBuilder sb = new StringBuilder();
 4
 5             using (FileStream fsRead=new FileStream(strPath,FileMode.Open,FileAccess.Read))
 6             {
 7                 Person p1 = bf.Deserialize(fsRead) as Person;
 8                 if (p1!=null)
 9                 {
10                     Car c1 = p1.MyCar;
11                     if (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                     }
16                     else
17                     {
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("请输入您的姓名:");
 2             string sName = Console.ReadLine();
 3             if (!string.IsNullOrEmpty(sName))
 4             {
 5                 Console.WriteLine("{0},请输入你的年龄:",sName);
 6                 int iAge = int.Parse(Console.ReadLine());
 7                 Console.WriteLine("{0},请输入你的性别:",sName);
 8                 string sSex = Console.ReadLine();
 9                 Console.WriteLine("{0},请输入你的E-Mail地址:",sName);
10                 string sEmail = Console.ReadLine();
11                 Console.WriteLine("{0},请输入你的联系电话:",sName);
12                 string sPhone = Console.ReadLine();
13                 Console.WriteLine("{0},请输入你的通信地址:",sName);
14                 string sAddress = Console.ReadLine();
15
16                 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"];
 2             string 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这个程序集。问题即可解决。

时间: 2024-09-30 04:31:45

C#中的二进制序列化和Json序列化的相关文章

Atitit php序列化&#160;php的serialize序列化和json序列化

Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP withYahoo! Web Services 一文中给出所有的字母标示及其含义:a - arrayb - booleand - doublei - integero - common objectr - references - stringC - custom objectO - classN - nu

Newtonsoft.Json序列化字符串-格式化

转自:https://blog.csdn.net/wlphlj/article/details/51982866最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson()        {            DataTable dt = new DataTable();            dt.Columns.Add("Age", Type.GetType("System.Int32&quo

json序列化NULL

在项目中遇到一问题,json序列化需要将null传递给前端,但之前项目中使用的都是fastjson的JSONObject.toJSONString(vo),这样会过滤掉为NULL的属性. 解决办法: 1.依然使用fastjson,使用SerializerFeature.WriteMapNullValue参数,不过滤null,null也会传递给前端 String s = JSONObject.toJSONString(vo,SerializerFeature.WriteMapNullValue);

java编解码技术,json序列化与二进制序列化

1.何为json序列化与二进制序列化 通常我们在程序中采用的以json为传输,将json转为对象的就是json序列化了.而二进制序列化通常是我们将数据转换为二进制进行传输,然后在进行各类转换操作 2.适用场景 小编觉得当数据采用json传输的时候,适用与web与控制层的转换,前端js对json的支持较好,而程序内部系统与系统之间采用二进制序列化编码形式进行编码进行数据传输,这样可提高数据传输效率 3.优缺点 json序列化有点就是通俗易懂,常用,易于与前端交互,缺点就是没有二进制序列化后的数据传

C#中JSON序列化和反序列化

json序列化和反序列化帮助类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.IO; using System.Text.RegularExpressions; using System.We

C# 二进制、Xml、Json序列化和反序列化

昨天利用业余时间对比了下C#中三种序列化方式(二进制.Xml.Json),综合来看json方式生成的字节数组长度最短,但当你需要序列化的对象中包括byte[]类型,且其长度较长时,序列化后,xml方式的长度较json方式更短.xml方式中对byte[]做了base64转换. 最后综合三种情况,写了一个基于泛型的通用类来完成序列化和反序列化操作,仅供参考,若有什么错误之处,还请指教. using System; using System.Collections.Generic; using Sys

json序列化后的是字符串,不是二进制。是字符串!!!确定不是二进制!!!

1.现有一个自定义对象需要储存到sql数据库中去.这个对象里面属性很多,甚至包含一些元素量打到几十万的List集合属性.本人试着使用JSON序列化这个对象,储存到数据库,报maxjsonlength超限,于是修改为了Int32.MaxValue.这样做,虽然不报错了,但是JOSN字符串肯定很长的吧,这样,会使得数据库文件很大的吧.我想问的是,采用二进制储存,会不会没有这么大? : 从业务上说,为啥不把这些数据分解成数据库记录来存储?而要序列化打包成一堆难以查询的数据来存储?从技术上说,个人认为你

IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件 using System.IO; /// <summary> /// 配置绝对路径 /// </summary> private static string LogPath = ConfigurationManager.AppSettings["LogPath&

Memcached 类库 EnyimMemcached 下的JSON序列化和二进制序列化兼容

Jusfr 原创,转载请注明来自博客园,文章所用代码见于我的github . 本人在分布式的项目使用中 EnyimMemcached ,由于业务需求使用了其序列化扩展,这里作下记录. EnyimCaching 通过配置文件提供了扩展点,见github,序列化由 ITranscoder 接口定义,提供了 DefaultTranscoder 和 DataContractTranscoder 两个实现类,前者作为默认,后面以XML序列化的方式重写了前者的对象序列化方法. EnyimCaching 是很