C#序列化操作

序列化简介

序列化过程:序列化-》字节数组-》通信

反序列化过程:通信接收-》字节数组转换-》反序列化为原始对象

参考:https://www.cnblogs.com/gaoshang212/archive/2014/10/24/4048720.html

Protobuf简介

Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议数据存储等领域。

 google protobuf官方网站: https://developers.google.com/protocol-buffers/

Protobuf使用

安装

 visual studio中使用安装通过NuGet包管理安装protobuf-net即可(Marc Gravell),该项目github地址:https://github.com/mgravell/protobuf-net

对象序列化

protobuf对象序列化需对对象添加序列化标签,否则会报错(详见使用问题)

可序列化的对象如下添加标签:

 1         [ProtoContract]
 2         [Serializable]
 3         public class Person
 4         {
 5             /// <summary>
 6             /// 编号
 7             /// </summary>
 8             [ProtoMember(1)]
 9             public int Id { get; set; }
10             
11             /// <summary>
12             /// 姓名
13             /// </summary>
14             [ProtoMember(2)]
15             public string Name { get; set; }
16 
17             /// <summary>
18             /// 性别
19             /// </summary>
20             [ProtoMember(3)]
21             public Sex Sex { get; set; }
22 
23             /// <summary>
24             /// 地址
25             /// </summary>
26             [ProtoMember(4)]
27             public Address Address { get; set; }
28         }
29 
30         [ProtoContract]
31         [Serializable]
32         public class Address
33         {
34             [ProtoMember(1)]
35             public string Line1 { get; set; }
36 
37             [ProtoMember(2)]
38             public string Line2 { get; set; }
39         }
40 
41         /// <summary>
42         /// 性别
43         /// </summary>
44         public enum Sex
45         {
46             男,
47 48         }

 

序列化调用

1             MemoryStream ms=new MemoryStream();
2             ProtoBuf.Serializer.Serialize(ms,personList);//personList为待序列化对象

 序列化与反序列化

 通过字节数组序列化与反序列化。

注意无法将原始msBuild反序列化(得到对象所有元素为初始值)。

1             MemoryStream msBuild = new MemoryStream();
2             ProtoBuf.Serializer.Serialize(msBuild, p);//序列化
3             //ms.Position = 0;
4             byte[] msg = msBuild.ToArray();//转为字节数组
5 
6             //****deserialize from bytes*****
7             MemoryStream msRead = new MemoryStream(msg);//字节数组转为流
8             Person pReceived = null;
9             pReceived = ProtoBuf.Serializer.Deserialize<Person>(msRead);//流反序列化为原始对象

 

通过保存为文件的方式序列化与反序列化

 1             using (var file = File.Create("person.bin"))
 2             {
 3                 Serializer.Serialize(file, p);
 4             }
 5 
 6             Person newPerson;
 7             using (var file = File.OpenRead("person.bin"))
 8             {
 9                 newPerson = Serializer.Deserialize<Person>(file);
10             }

 

使用问题

1.保证序列化对象具有标签,否则报错:未预期的对象。

 

 

2.Unicode序列化与反序列化会报错:尝试读取超出流末尾内容。

 JSON序列化

json介绍

官网:https://www.json.org/json-zh.html

JSON数据格式简介:https://www.cnblogs.com/SkySoot/archive/2012/04/17/2453010.html

安装及初始化

使用Newtonsoft.Json进行序列化

序列化

代码如下:json序列化将对象序列化为json格式字符串,字符串再转为字节数组。

1             string strBuild = JsonConvert.SerializeObject(p);
2             byte[] bytesBuild = Encoding.UTF8.GetBytes(strBuild);

json将对象序列化为json格式字符串如下:

json将之表示为:

{"Id":23,"Name":"国G_05","Sex":1,"Address":{"Line1":"L1","Line2":"L2"},"Time":"2018-04-09T15:58:36.665541+08:00"}

注意其中时间的格式

反序列化

1             string strBuild = JsonConvert.SerializeObject(p);
2             byte[] bytesBuild = Encoding.UTF8.GetBytes(strBuild);
3 
4             //*****deserialize from bytes******
5             string strGet = Encoding.UTF8.GetString(bytesBuild);
6             Person pGet = JsonConvert.DeserializeObject<Person>(strGet);

Xml序列化

 

posted @ 2018-04-09 16:30  vantknispel  阅读(216)  评论(0)    收藏  举报