使用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. Mac下安装pear库+phpDocumentor

    1. 首先安装pear: curl -o go-pear.php https://pear.php.net/go-pear.phar 看见这个就安装OK: % Total % Received % X ...

  2. 梳理 Opengl ES 3.0 (二)剖析一个GLSL程序

    OpenGL ES shading language 3.0 也被称作 GLSL,是个 C风格的编程语言. Opengl ES 3.0内部有两种可编程处理单元,即Vertex processor和Fr ...

  3. 为什么logstash进程的CPU使用率100%?

    机器上有个进程cpu使用率很高,近100%了, Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie%Cpu(s): 99.0 ...

  4. struts2中的action为什么要继承ActionSupport类,不继承也可以,有什么好处?

    简单来说,有很多相关的方法都加载进来,你直接调用就行了,而且在安全上和稳定性上做了很好的处理 实际上继承ActionSupport之后 就等同于实现了很多接口 Action,Validateable, ...

  5. HDU 4745 Two Rabbits(最长回文子序列)(2013 ACM/ICPC Asia Regional Hangzhou Online)

    Description Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon ...

  6. Caused by: redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value

    对错误类型key的操作,也就是说redis中没有你当前操作的这个key,而你用这个key去执行某些操作!检查key是否正确

  7. 编程练习:寻找发帖"水王"扩展问题二

    回顾 在前面两篇文章已经实现了水王id出现次数超过一半,以及水王id出现次数刚好一半 分析 借助上面水王id出现次数刚好出现一半的分析,其实这里就是找出数组中出现次数前三的元素,具体的分析,见前面两篇 ...

  8. lintcode-137-克隆图

    137-克隆图 克隆一张无向图,图中的每个节点包含一个 label 和一个列表 neighbors. 数据中如何表示一个无向图?http://www.lintcode.com/help/graph/ ...

  9. stap中的entry函数

    只有在ret probe函数中,在这个函数中才会使用@entry函数去提取变量 是因为ret probe 有什么特殊的吗?在中间这个变量会变化吗? A new operator, @entry, is ...

  10. Linux笔记二

    用户和组 添加一个tom用户,设置它属于users组,并添加注释信息分步完成:useradd tom usermod -g users tom usermod -c "hr tom" ...