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


    前段时间项目中有一个这样的需求:需要在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序列化困难重重,无奈只好选择了最搓的一种方法了!

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

  • 相关阅读:
    给部署在openshift上的WordPress添加wptouch插件
    让你的代码符合PEP8标准——sublime text 2 安装及使用 Python Flake8 Lint 插件
    Pylot——跨平台的网站压力测试工具
    window.print打印指定div
    window.parent与window.opener的区别 转
    获取Windows Mobile开发工具
    event.srcElement
    GridView的各种用法
    JS 中document详解
    llog
  • 原文地址:https://www.cnblogs.com/yangcaogui/p/3009058.html
Copyright © 2020-2023  润新知