对象在java中是以堆的方式存储。有时候需要复制对象或者存储对象,而不是对象的引用,这时候就需要用的对象的序列化和反序列化。

1.序列化

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

很详细的博客Java中的序列化Serialable高级详解。

简单的来说大概有几点注意事项:

  1. 对象要实现了Serializable 接口
  2. 如果序列化和反序列化的serialVersionUID不同则反序列化失败,因为java是通过这个来进行序列化验证的。因此最好还是要定义serialVersionUID
  3. 序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量
  4. Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null
  5. 一个子类实现了 Serializable 接口,它的父类都没有实现 Serializable 接口,序列化该子类对象,然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不同。反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。

2.实例

 1 /**
 2  * Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 3  */
 4 package com.thinkgem.jeesite.common.utils;
 5
 6 import java.io.ByteArrayInputStream;
 7 import java.io.ByteArrayOutputStream;
 8 import java.io.ObjectInputStream;
 9 import java.io.ObjectOutputStream;
10 import java.lang.reflect.Method;
11
12 import org.apache.commons.lang3.StringUtils;
13
14 /**
15  * 对象操作工具类, 继承org.apache.commons.lang3.ObjectUtils类
16  * @author ThinkGem
17  * @version 2014-6-29
18  */
19 public class ObjectUtils extends org.apache.commons.lang3.ObjectUtils {
20
21     /**
22      * 注解到对象复制,只复制能匹配上的方法。
23      * @param annotation
24      * @param object
25      */
26     public static void annotationToObject(Object annotation, Object object){
27         if (annotation != null){
28             Class<?> annotationClass = annotation.getClass();
29             Class<?> objectClass = object.getClass();
30             for (Method m : objectClass.getMethods()){
31                 if (StringUtils.startsWith(m.getName(), "set")){
32                     try {
33                         String s = StringUtils.uncapitalize(StringUtils.substring(m.getName(), 3));
34                         Object obj = annotationClass.getMethod(s).invoke(annotation);
35                         if (obj != null && !"".equals(obj.toString())){
36                             if (object == null){
37                                 object = objectClass.newInstance();
38                             }
39                             m.invoke(object, obj);
40                         }
41                     } catch (Exception e) {
42                         // 忽略所有设置失败方法
43                     }
44                 }
45             }
46         }
47     }
48
49     /**
50      * 序列化对象
51      * @param object
52      * @return
53      */
54     public static byte[] serialize(Object object) {
55         ObjectOutputStream oos = null;
56         ByteArrayOutputStream baos = null;
57         try {
58             if (object != null){
59                 baos = new ByteArrayOutputStream();
60                 oos = new ObjectOutputStream(baos);
61                 oos.writeObject(object);
62                 return baos.toByteArray();
63             }
64         } catch (Exception e) {
65             e.printStackTrace();
66         }
67         return null;
68     }
69
70     /**
71      * 反序列化对象
72      * @param bytes
73      * @return
74      */
75     public static Object unserialize(byte[] bytes) {
76         ByteArrayInputStream bais = null;
77         try {
78             if (bytes != null && bytes.length > 0){
79                 bais = new ByteArrayInputStream(bytes);
80                 ObjectInputStream ois = new ObjectInputStream(bais);
81                 return ois.readObject();
82             }
83         } catch (Exception e) {
84             e.printStackTrace();
85         }
86         return null;
87     }
88 }

java.io.ObjectOutputStream:表示对象输出流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流

它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

本示例中,将对象序列化为byte数组,首先创造一个ByteArrayOutputStream字节数组输出流,表示输出。然后使用ObjectOutputStream(字节数组输出流)来构造一个对象输出流,表示将对象输出到字节数组输出流中。最后通过 oos.writeObject(object);将object写入字节数组输出流,再转换为字节数组。反序列则相反。

转载于:https://www.cnblogs.com/woshimrf/p/5212639.html

将对象序列化和反序列化相关推荐

  1. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  2. 代码即财富之我学Java对象序列化与反序列化(2)

    2019独角兽企业重金招聘Python工程师标准>>> 我们在程序创建的Java对象都是存在于JVM内存中的,也就是Java对象的生命周期一定不会长于JVM,所以如何以一种持久化的方 ...

  3. 从零开始学前端:对象序列化与反序列化、冒泡排序、数组去重 --- 今天你学习了吗?(JS:Day11)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(JS) 复习:从零开始学前端:字符串和数组的方法 - 今天你学习了吗?(JS:Day10) 文章目录 从零开始学前端:程序猿小白也可以完全 ...

  4. C#对象序列化与反序列化zz

    C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...

  5. C#对象序列化与反序列化

    C#对象序列化与反序列化 C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍............. ...

  6. Xson:Java对象序列化和反序列化工具

    1. Xson 介绍  Xson是一个Java对象序列化和反序列化程序.支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化.  地址:https://github.com/xso ...

  7. C#对象序列化和反序列化

    C#对象序列化和反序列化 序列化:就是将对象转换为二进制 反序列化:就是将二进制转换为对象 作用:传输数据. 序列化: 1).将这个类标记为可以被序列化的. 在要序列化的类上面标记[Serializa ...

  8. Java对象序列化与反序列化

    什么是序列化与反序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送: ...

  9. FastJson实现复杂对象序列化与反序列化

    一.认识FastJson 1.优势 fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果说明比gson快大约6倍,fastjson采用独创的算法 ...

  10. 对象序列化与反序列化

    目录 序列化 反序列化 ObjectOutputStream ObjectInputStream 序列化 一个类必须实现了Serializable 接口,其对象才能序列化,Serializable接口 ...

最新文章

  1. javascript变量声明 及作用域
  2. 20165219 预备作业3 Linux安装及学习
  3. c语言对分查找实验报告,C语言实验指导.doc
  4. 科普|数据治理如何在 Martech 中发挥效能?
  5. 多个div并排居中显示
  6. numpy的通用函数:快速的元素级数组函数
  7. 数据结构基础(5) --归并排序
  8. inspect python模块_Python inspect模块:仅限关键字参数
  9. magento网站建设_跨境自建站Magento麦进斗代打包代贴单代发货
  10. oss上传判断_OSS
  11. 下载SAP标准教程的方法
  12. java常见面试题:Java程序员面试题(三)
  13. 桂林老兵php,中间件解析漏洞
  14. hashmap自定义排序java,如何在Java中对HashMap进行排序
  15. [转载]每天早晨含姜片含出三大奇迹/姜的二十种食疗功/生姜克
  16. 怎样将UltraISO做的启动U盘还原成原来的样子
  17. 姚锦云:再论庄子传播思想与接受主体性:回应尹连根教授
  18. 分享一个插件-水珠自动下落效果
  19. 浅谈Android中的Fragment
  20. 【Auto.js】QQ名片点赞

热门文章

  1. Mysql 第一范式入门
  2. Hive 数据质量检测
  3. c++通过TCP/IP协议提交POST信息登录到PHPChina中文开发者社区
  4. Centos7 / RHEL 7 双网卡绑定
  5. Linux系统目录结构解析(centos)
  6. 经典:从追MM谈Java的23种设计模式
  7. HelloMybatis
  8. 关于利用 achartengine 画 股票 分时线
  9. Struts,Spring 等开源项目svn 地址
  10. Python如何输出格式清晰的dict