将对象序列化和反序列化

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

时间: 2024-12-14 20:14:09

将对象序列化和反序列化的相关文章

Java对象序列化和反序列化

Java对象序列化和反序列化 在Java中,我们如果要保存一个对象的瞬时状态值,以便在下次使用时能够得到这些值,或者持久化对象,或者使用RMI(远程方法调用),或在网络中传递对象时,此时我们就需要将对象序列化,实现序列化,我们只要实现Serializable接口,该接口是一个标记接口(Tag interface),即里面没有方法,其主要作用就是告诉JVM该类的对象可以进行序列化. 一般来说,很多类的对象都实现了Serializable接口,但是,有些对象是不能进行序列化的,比如与数据库相关的连接

【转】Java对象序列化和反序列化

[转自]孤傲苍狼的Java基础学习总结——Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对 象,当有 10万用户并发访问,就有可

java 对象序列化与反序列化

Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节序列的过程: Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的

Java对象序列化与反序列化

Java对象序列化与反序列化 对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存在,从而可以保存在磁盘上,也可以在网络间传输. 对象的序列化是将一个Java对象写入IO流:与此对应的,反序列化则是从IO流中恢复一个Java对象. 实现序列化 如果要将一个java对象序列化,那么对象的类需要是可序列化的.要让类可序列化,那么这个类需要实现如下两个接口

对象序列化和反序列化应该写为一个工具类

对象序列化和反序列化工具类 package com.umu.util; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.Object

对象序列化与反序列化

1)要想让一个对象成为序列化对象,那么这个类就要实现Serializable或Externalizable接口(Externalizable接口继承与Serializable接口), 这种序列化仅对对象的 非transient 的实例变量进行序列化,不会对静态成员变量序列化,也不会对方法序列化 2) 对象序列化:把java“对象”转换成“字节序列”的过程称为对象序列化 对象反序列化:把“字节序列”恢复成java“对象”的过程称为反序列化 在反序列化时不会调用类的任何构造方法 3) 对象序列化的功

Java Object 对象序列化和反序列化

Java Object 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但

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

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例

继承+组合应用示例 1 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 2 def __init__(self,name,year,mon,day): 3 self.name = name 4 self.year=year 5 self.mon=mon 6 self.day=day 7 def tell_birth(self): 8 print('%s:%s-%s-%s'%(self.name,self.year,self.mon,self.day)) 9 10 11

(JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)

对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  ObjectInputStream 使用: 对象的输出流将指定的对象写入到文件的过程,就是将对象序列化的过程,对象的输入流将指定序列化好的文件读出来的过程,就是对象反序列化的过程.既然对象的输出流将对象写入到文件中称之为对象的序列化,那么可想而知对象所对应的class必须要实现Serializable接