将对象序列化和反序列化

简介:

对象在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写入字节数组输出流,再转换为字节数组。反序列则相反。

 

本文转自Ryan.Miao博客园博客,原文链接:http://www.cnblogs.com/woshimrf/p/5212639.html,如需转载请自行联系原作者
相关文章
|
2月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
2月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
47 2
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
48 0
|
3月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
45 1
|
3月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
26 1