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

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

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

  1. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  2. 三种序列化方式性能比较

    一下代码比较了二进制序列化.xml序列化.Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢 using System; using System.Collect ...

  3. 线程的三种创建方式和他们的优缺点

    文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...

  4. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  5. python爬虫学习笔记-网络爬虫的三种数据解析方式

    爬虫的分类 1.通用爬虫:通用爬虫是搜索引擎(Baidu.Google.Yahoo等)"抓取系统"的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份 ...

  6. 联邦学习的基本概念、三种框架和应用场景

    联邦学习的基本概念.三种框架和应用场景 前言 本文主要总结记录了联邦学习的基本概念.三种基本框架及其应用场景,下篇将从威胁模型和攻防现状入手介绍联邦学习的安全隐私现状- 一.提出背景 需求: 人工智能 ...

  7. 【CSDN软件工程师能力认证学习精选】vue.js 三种方式安装(vue-cli)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  8. 强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用

    强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用 在第七篇笔记(https://blog.csdn.net/hhy_csdn/article/deta ...

  9. 假设指令字长为16位,操作数的地址码为6位,指令有零地址、一地址、二地址三种格式......

    假设指令字长为16位,操作数的地址码为6位,指令有零地址.一地址.二地址三种格式.  (1)设操作码固定,若零地址指令有M种,一地址指令有N种,则二地址指令最多有几种?  (2)采用扩展操作码技术,二 ...

  10. 计算机辅助的临床会谈,e医生学习日记24-临床心理学三种研究技术

    e医生学习日记24-临床心理学三种研究技术 (2006-05-12 06:54:59) 1.访谈法:是研究者通过与研究对象的交谈来收集有关对方心理特征与行为的数据资料的研究方法.特点是由研究者(访谈者 ...

最新文章

  1. 使用OleDb,将Excel导入DataSet
  2. windows2008的功能介紹及其与2003的差异
  3. vs2010如何安装qt插件
  4. java 配置写成表达式_Java的正则表达式之小结
  5. SP2-0734: 未知的命令开头 imp scott/... - 忽略了剩余的行。
  6. JPA结合querydsl使用
  7. 关于机器人创业:学术界vs工业界及中国机器人企业的机会
  8. skl pipline 运行流程演示
  9. C# Parellel.For 和 Parallel.ForEach
  10. Power BI 矩阵总计放表第一列
  11. ChatGPT: 人工智能对话模型的前沿技术与应用探析
  12. mysql5.1 优化_7. 优化 - [ MySQL 5.1参考手册 ] - 在线原生手册 - php中文网
  13. 开源项目推荐:OpenGL之gult/freeglut/glew/glfw/glad的联系与区别
  14. 5.入律古风、排律与柏梁体
  15. mysql8 中的rank_Mysql8.0+中的rank()、row_num()、dense_rank()等窗口函数
  16. 冶炼金属【暴力枚举 + 二分 + 二元不等式】
  17. 【Code】Java 打印基本图形(圆形,梯形,椭圆,三角形,矩形)的面积和周长
  18. js脚本爬取网页数据案例解析
  19. 国王将金币作为工资,发放给忠诚的骑士。第1天,骑士收到一枚金币;之后两天(第2天和第3天)里,每天收到两枚金
  20. 三种技术实现PC1、PC2与PC3都通,而PC1与PC2不通

热门文章

  1. mysql读写分离_SpringBoot+MyBatis+MySQL读写分离
  2. Python classmethod()
  3. AC自动机1030 [JSOI2007]文本生成器
  4. 奇新CMS教程(一)——在奇新CMS中添加五连幅焦点图片
  5. Java——异常和断言
  6. 快速查找Unity中的死循环
  7. UGUI Text组件扩展
  8. 镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵_守护灵重置方法_3DM手游...
  9. mit的java教材_关于学习MIT6.828操作系统课程lab1记录
  10. 多个容器一起打包_Docker从入门到掉坑(三):容器太多,操作好麻烦