反序列化

用fastjson反序列化时的一个需要注意的地方

时光毁灭记忆、已成空白 提交于 2020-04-12 15:35:35
问题描述: fastjson反序列化时现解析不正确的问题,expiretime属性值不正确。 问题分析: 当ValidateCode有两个构造函数,且先后位置如图时,fastjson反序列化时,expiretime是不正确的。两个构造函数互换位置后可以正常反序列化。 加入一个无参的默认构造函数(这个构造函数的位置不重要)也可以解决问题。 fastjson的相关源码:com.alibaba.fastjson.util.JavaBeanInfo的build方法和com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer的deserialze方法。 主要关注JavaBeanInfo类中fields和creatorConstructor两个属性的值,基本可以了解为什么会产生上面的问题。 结论: 用fastjson进行反序列化时,对应的javabean需要有默认的构造函数(即按照javabean的规范来)。 来源: oschina 链接: https://my.oschina.net/u/999023/blog/1785611

Java中对象序列化与反序列化

…衆ロ難τιáo~ 提交于 2020-02-29 08:43:10
1. 概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 把对象的字节序列永久地保存到 硬盘 上,通常存放在一个文件中; 在网络上传送对象的字节序列。   在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。   当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 2. JDK类库中的序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。   java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。  

(1)java序列化--java.io.Serializable接口解析

霸气de小男生 提交于 2019-12-05 08:06:48
(PS:本文为作者原著,如需转载,请注明出处-_^) 使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看mina和公司内部涉及到nio框架的一些源码,里面涉及到hession、java这两种序列化,至于hession序列化为什么会诞生以及在apache项目中使用如此广泛,以及java本身序列化存在哪些缺陷,甚是不解,为了解答上面抛出来的疑惑,以及进一步了解java的序列化机制,这里开个小头,从java的序列化接口Serializable开始说起 jdk包里的Serializable接口的注释主要说明了以下几点: 1.类通过实现 Serializable接口来启用序列化,否则该类的任何状态将无法被序列化,同时也无法用于反序列化 2.若继承的父类没有实现 Serializable接口,但是又想让子类可序列化,有三个注意事项: a).子类实现Serializable接口 b).子类必须有可访问的无参构造方法,用于保存和恢复父类的public或protected或同包下的package字段的状态,否则在序列化或反序列化时会抛出RuntimeException异常 c).对于序列化后的子类,在进行反序列化时,理论上无法初始化父类中private(不可访问)对象变量的状态或值 3

序列化介绍

醉酒当歌 提交于 2019-12-02 03:18:47
什么是序列化 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化”(Deserialization)。 简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。 2 为什么使用序列化2.1 哪些情况需要使用序列化2.1.1 以某种存储形式使自定义对象持久化 通过序列化,可以将对象的状态保持在存储媒体中,在以后能够重新创建精确的副本。我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。 2.1.2 将对象从一个地方传递到另一个地方 通常来说,对象仅在创建对象的应用程序域中有效

表单序列化与反序列化JSON对象(基于jQuery)

蓝咒 提交于 2019-12-02 01:01:39
最近根据自身项目的特点写了一个表单序列化与反序列化工具,该工具是基于jQuery的,生成JSON对象。虽然jQuery本身已经实现了相似功能和API( $().serialize() 和 $().serializeArray() ),但使用起来不是特别方便。以下是我的实现方式: 序列化表单值,结果以key/value形式返回JSON数据。key为表单对象名称(name||id),value为其值。 表单HTML格式约定: 表单容器: 通常是一个form表单(如果不存在就以body为父容器)或div,里面包含输入标签和子容器; 子容器(也可以没有): 必须包括属性fieldset="XXX" div标签,里面包含输入标签和子容器。序列化后将生成以XXX为主键的json对象.如果子容器存在嵌套则以fieldset为主键生成不同分组的json对象。 输入标签: 输入标签为input类型标签(包括:'checkbox','color','date','datetime','datetime-local','email','file','hidden','month','number','password','radio','range','reset','search','submit','tel','text','time ','url','week')。而'button','reset

FastJson 反序列化注意事项

不问归期 提交于 2019-11-29 22:58:19
问题描述 使用fastJson对json字符串进行反序列化时,有几个点需要注意一下: 反序列化内部类 反序列化模板类 0. Getter/Setter问题 如我们希望返回的一个json串为 "name" : "name", "isDeleted" : true, "isEmpty" : 1 下面是我们的定义的dto对象,通过序列化后能得到我们预期的结果么? private String name; private boolean isDeleted; private int isEmpty; public BaseDO() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isDeleted() { return isDeleted; } public void setDeleted(boolean deleted) { isDeleted = deleted; } public int getIsEmpty() { return isEmpty; } public void setIsEmpty(int isEmpty) { this.isEmpty = isEmpty; }

Java序列化与JSON序列化大比拼

北慕城南 提交于 2019-11-27 13:28:31
一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语言无关,扩展性强,速度也应该不慢。 大家可能对Java序列化都有一个错误的认识,认为Java序列化比JSON的序列化效率高并且序列化的数据小,其实实际上并不一定是这样,我这次就想通过实际测试来解开这个谜团 。 二、测试方式 测试同一个Map<String,Object>并序列化为byte[],并再将byte[]反序列化为Map<String,Object>的过程。Object中包括String,Integer,Long,Boolean,Float,Double常规类型的数据。 序列化:Map<String,Object> -> byte[] 反序列化: byte[] -> Map<String,Object> 测试各种大小不同的Map,并循环执行同一操作N次,来得到一个相对稳定的线性结果。 三、比较的对象 JAVA: 手写Java(1.6.0_32)与Common Lang3(3.1)的SerializationUtils。 JSON: 将采用Gson(2.2.2)与json-smart(2.0-RC2)两种不同的JSON解析器。json