使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化:

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)

@JsonIgnoreProperties

类注解,作用是json序列化时将bean中的一些属性忽略掉,序列化和反序列化都受影响。

@JsonIgnore

作用于属性或字段上,当生成json时忽略有该annotation的方法或字段。

@JsonProperty("rename")

作用于属性或字段上,对其重命名。

@JsonFormat

作用于属性或字段上,方便把Date类型直接转化为我们想要的模式,如@JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")

@JsonSerialize

作用于属性或字段上,指定序列化方式。

例如:@JsonSerialize(as=BasicType.class)将类型序列化成指定类型;@JsonSerialize(using=CustomDoubleSerialize.class)用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后限制两位小数。

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
//保证序列化json的时候,如果是null的对象,key也会消失
//比如在创建失败的时候,只需要将status和msg显示出来,但是如果不加上面的注解会将data也显示出来,其值会显示null

@JsonDeserialize

作用于属性或字段上,指定反序列化方式。

例如:@JsonDeserialize(as=ValueImpl.class)将类型反序列化成指定类型;@JsonDeserialize(using=CustomDateDeserialize.class)用于在反序列化时嵌入我们自定义的代码。

 

序列化与反序列化

例子:

public class ServerResponse<T> implements Serializable{

Serializable是一个标识接口,它没有定义任何方法,实现了这个接口,就代表这个类可以进行串行化了。

串行化也叫序列化,就是将实例的状态转化成文本(或二进制)的形式,以便永久保存(所以也叫持久化)或在网间传递。

什么时候实现java.io.Serializable接口?

如果一个类的实例需要持久化或者需要在网间传递的时候,就用到串行化。

例如:action,dao层的一些个类一般不需要串行化,而bean层的一些个类一般需要串行化。因为客户端用到action,dao层的时候都是import过来,然后自己进行实例化的,或者直接调用容器中的实例;而bean不一样,客户端不可以new一个出来给自己,客户端需要从服务器端接收一个bean,读取bean中的信息状态,然后做出一系列反应,而这个传输过程就用到了串行化。

为什么要实现序列化?

序列化实体对象是为了方便网络传输。因为网络传输数据只能是二进制流,序列化能将实体转化为二进制流传输,同时还可通过反序列化重新将二进制流还原成实体对象。

序列化在网络协议中的应用:

OSI七层协议模型中表现层的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象。这两个功能就是序列化和反序列化。而TCP/IP协议的应用层对应OSI七层模型的应用层、表示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。

序列化:将数据结构或对象转换成二进制串的过程。

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或对象的过程。

序列化的作用:

1)把对象的字节序列持久化永久地保存到硬盘上。

  例如:web服务器中的session对象,当有10万用户并发访问,就有可能出现10万个session对象,内存可能不够用,于是web容器就会把一些session先序列化到硬盘中,等要用的时候,再把保存在硬盘中的对象还原到内存中。

2)在网络上传送对象的字节序列。

  例如:当两个进程在进行远程通信时,彼此可以发送各种类型的数据,无论是何种类型的数据,都会以二进制序列的形式在网络上传送,发送方需要把这个java对象转换为字节序列,才能在网络上传送,接收方则需要把字节序列再恢复为java对象。

JDK类库中的序列化API例子可以详见http://blog.csdn.net/abc6368765/article/details/51365838

serialVersionUID:序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量,即private static final long serialVersionUID。

如何序列化生成serialVersionUID以及是否加这个UID导致的区别和为什么,详见http://blog.csdn.net/abc6368765/article/details/51365838

最好显示指定serialVersionUID,为什么?

因为原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同时才能被正常的反序列化。如果不显示指定,在一次执行序列化后,如果增加或者删除了某些成员变量,再次执行序列化,系统就会重新生成hash值然后赋给UID,导致反序列化的时候报error。

注意:

1.如果一个类想被序列化,需要实现Serializable接口。否则将抛出NotSerializableException异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种,这也是为什么Serializable虽然是一个空接口,但是只要实现了该接口就能序列化和反序列化。

2.在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略,虽然这俩方法不是被显示调用,但是因为在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用到它们。

ArrayList源码中有关序列化的使用http://www.hollischuang.com/archives/1140#What%20Serializable%20Did

json相关注解和序列化与反序列化的更多相关文章

  1. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  2. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  3. ASP.NET中JSON对时间进行序列化和反序列化

    JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...

  4. C++ 基于rapidjson对json字符串的进行序列化与反序列化

    json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...

  5. C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化

    在前两篇文章中,我们已经完成对普通对象以及复杂对象嵌套的序列化与反序列化,见如下地址: C++对象的JSON序列化与反序列化探索 C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化 ...

  6. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  7. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  8. 【转】Newtonsoft.Json 的序列化与反序列化

    http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...

  9. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

随机推荐

  1. tp5 项目实战 初级 文字步骤

    项目实战 环境搭建 新建模块  admin 新建文件夹 controller   model  view View   中新建 user  index 相关样式  js   图片     放入publ ...

  2. centos7安装python3.7

    Centos7安装Python3的方法   由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_ ...

  3. Node.js的require()的工作原理

    大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘. 我们追寻Node模块系统的核心: module ...

  4. 语法测试cnblogs使用Markdown

    参考自作业部落Cmd Markdown 编辑器 https://www.zybuluo.com 欢迎使用 Cmd Markdown 编辑阅读器 什么是 Markdown Markdown 是一种方便记 ...

  5. 并查集——poj1611(入门)

    传送门:The Suspects 并查集水题 #include <iostream> #include <cstdio> #include <algorithm> ...

  6. 一个简单的NetCore项目:1 - 搭建框架,生成数据库

    1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...

  7. 【python爬虫】对喜马拉雅上一个专辑的音频进行爬取并保存到本地

    >>>内容基本框架: 1.爬虫目的 2.爬取过程 3.代码实现 4.爬取结果  >>>实验环境: python3.6版本,pycharm,电脑可上网. [一 爬虫目 ...

  8. 好用的在线pdf转化器

    https://smallpdf.com/cn/compress-pdf

  9. 在.net2.0下使用System.Web.Script.Serialization;

    最近,在弄json字符串转为对象.需要添加这个引用System.Web.Script.Serialization;因为版本必须是dotnet2.0的原因,发现很多解决方案不适合自己.故使用这种解决办法 ...

  10. BZOJ4690 Never Wait for Weights(并查集)

    带权并查集按秩合并即可维护. #include<iostream> #include<cstdio> #include<cmath> #include<cst ...