学习之路二十七:三种序列化方式的一些注意点
前段时间项目中有一个这样的需求:需要在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序列化困难重重,无奈只好选择了最搓的一种方法了!
以同步至:个人文章目录索引