学习之路二十七:三种序列化方式的一些注意点

时间:2022-12-13 20:15:59

前段时间项目中有一个这样的需求:需要在Service挂掉的情况下保存内存中的数据!

因为我们的内存其实是一个结构比较复杂的对象,嵌套的比较复杂,在没有编码之前把任务计划都安排好了,方案是对内存对象进行JSON序列化之后保存到本地文件中去,其实想想挺简单的,可是在实际编码的时候还是遇到了很多关于序列化方面的问题,最大的原因就是我们对每一种序列化方式还理解的不够!

下面就说说一些常用的序列化方式,文中可能会代码比较少,主要说一些注意点!

1.二进制序列化

  优点:只要是标记了[Serializable]序列化特性,那么这个对象里面的任何东西(私有的,公共的)都会被序列化成二进制!

  限制点:这种序列化方式就像眉毛胡子一把抓,不管什么东西就会被序列化,而且保存到文件的内容都是二进制没有任何可查看的意义 - 看不懂啊!

      不过我们也可以通过[NonSerialized]设置哪些可以序列化,哪些不要序列化的!

2.JSON序列号

  优点:跨平台数据传输,而且序列化之后的结构清晰易于解析!

  限制点:可是我们在序列化的时候发现有这样一个问题(使用的fastJSON类库):

      ①如果对象中有没有无参的构造函数,就会报错(就是在底层代码在反射该对象时会报错)

        如果使用.NET自带的JSON转化类也会出现这样的问题!

3.XML序列化

  优点:跨平台数据传输,结构清晰,.NET有强大的类库支持!

  限制点:可是有的时候却不是万能的,因为它有两点点如下限制:

      ①比如下面中Name属性就不能被序列化,因为我们设置了Set为私有的

1     public class Test
2 {
3 public string Name { get; private set; }
4 }

       ②如果对象中有Dictionary变量的话也会造成无法序列化

        因为Dictionary不支持XML序列化,也是自己实现XML序列化,不过有一种变通的方式,我们可以把Dictionary中的Key和Value封装成一个对象,然后形成一个List集合,那么就可以使用XML序列化了,如:

 1     public class Person
2 {
3 public string Name { get; set; }
4 }
5
6 public class PersonKeyValue
7 {
8 public string Key { get; set; }
9
10 public Person Value { get; set; }
11 }
12
13 public class Test
14 {
15 public void XMLSerialize()
16 {
17 Dictionary<string, Person> dictionary = new Dictionary<string, Person>();
18 List<PersonKeyValue> list = new List<PersonKeyValue>();
19 foreach (KeyValuePair<string, Person> person in dictionary)
20 {
21 list.Add(new PersonKeyValue { Key = person.Key, Value = person.Value });
22 }
23
24 //最后再对list进行XML序列化就可以了
25 }
26 }

       通过一种变通的方式就可以实现Dictionary的XML序列化了!

 

最后我们使用了二进制序列化解决了问题,其实最好的还是使用XML进行序列化,可是由于我们项目中的对象太过复杂,而且类型太多导致了XML序列化困难重重,无奈只好选择了最搓的一种方法了!

 

 以同步至:个人文章目录索引