将对象序列化和反序列化
2016-02-24 13:33
435 查看
对象在java中是以堆的方式存储。有时候需要复制对象或者存储对象,而不是对象的引用,这时候就需要用的对象的序列化和反序列化。
很详细的博客Java中的序列化Serialable高级详解。
简单的来说大概有几点注意事项:
对象要实现了Serializable 接口
如果序列化和反序列化的serialVersionUID不同则反序列化失败,因为java是通过这个来进行序列化验证的。因此最好还是要定义serialVersionUID
序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null
一个子类实现了 Serializable 接口,它的父类都没有实现 Serializable 接口,序列化该子类对象,然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不同。反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
java.io.ObjectOutputStream:表示对象输出流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
本示例中,将对象序列化为byte数组,首先创造一个ByteArrayOutputStream字节数组输出流,表示输出。然后使用ObjectOutputStream(字节数组输出流)来构造一个对象输出流,表示将对象输出到字节数组输出流中。最后通过 oos.writeObject(object);将object写入字节数组输出流,再转换为字节数组。反序列则相反。
1.序列化
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。很详细的博客Java中的序列化Serialable高级详解。
简单的来说大概有几点注意事项:
对象要实现了Serializable 接口
如果序列化和反序列化的serialVersionUID不同则反序列化失败,因为java是通过这个来进行序列化验证的。因此最好还是要定义serialVersionUID
序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null
一个子类实现了 Serializable 接口,它的父类都没有实现 Serializable 接口,序列化该子类对象,然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不同。反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
2.实例
/** * Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. */ package com.thinkgem.jeesite.common.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Method; import org.apache.commons.lang3.StringUtils; /** * 对象操作工具类, 继承org.apache.commons.lang3.ObjectUtils类 * @author ThinkGem * @version 2014-6-29 */ public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils { /** * 注解到对象复制,只复制能匹配上的方法。 * @param annotation * @param object */ public static void annotationToObject(Object annotation, Object object){ if (annotation != null){ Class<?> annotationClass = annotation.getClass(); Class<?> objectClass = object.getClass(); for (Method m : objectClass.getMethods()){ if (StringUtils.startsWith(m.getName(), "set")){ try { String s = StringUtils.uncapitalize(StringUtils.substring(m.getName(), 3)); Object obj = annotationClass.getMethod(s).invoke(annotation); if (obj != null && !"".equals(obj.toString())){ if (object == null){ object = objectClass.newInstance(); } m.invoke(object, obj); } } catch (Exception e) { // 忽略所有设置失败方法 } } } } } /** * 序列化对象 * @param object * @return */ public static byte[] serialize(Object object) { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { if (object != null){ baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); return baos.toByteArray(); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 反序列化对象 * @param bytes * @return */ public static Object unserialize(byte[] bytes) { ByteArrayInputStream bais = null; try { if (bytes != null && bytes.length > 0){ bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } } catch (Exception e) { e.printStackTrace(); } return null; } }
java.io.ObjectOutputStream:表示对象输出流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
本示例中,将对象序列化为byte数组,首先创造一个ByteArrayOutputStream字节数组输出流,表示输出。然后使用ObjectOutputStream(字节数组输出流)来构造一个对象输出流,表示将对象输出到字节数组输出流中。最后通过 oos.writeObject(object);将object写入字节数组输出流,再转换为字节数组。反序列则相反。
相关文章推荐
- vim 退出保留显示的内容
- 在ASP.NET MVC中创建一个统一布局的Web页面站点
- (原创)Bugzilla众包行为模式挖掘
- am437x移植streamer
- salt常用命令
- strlen和sizeof的区别
- 宫格布局
- IDEA 配置 tomcat 启动内存
- 如何用PhpMyAdmin快速创建全新数据库并导入数据
- matlab练习程序(倾斜校正,透视变换)
- UVA 1267 - Network(贪心DFS)
- 大写和小写转换
- RDLC 报表参数、常量及常用表达式的使用
- SublimeText 插件 - PlainTasks使用方法
- 【bzoj3613】[Heoi2014]南园满地堆轻絮 二分答案
- eclipse git集成
- 简单的进度条
- 怎么解决input框中加入disabled="disabled"之后,改变字体的颜色(默认的是灰色)
- 关于Method override for the designated initializer of the superclass '-init' not found警告
- git修改了本地代码想传到新的branch