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

原创 2015年07月06日 16:40:41

1.什么是对象的序列化(serialize)与反序列化(deserialize)?

序列化本质上就是把对象内存的数据按照一定的规则,变成一系列的字节数据,然后再把这些字节数据写入到流中。而反序列化的过程则相反,先读取字节数据,然后再重新组装成对象。

2.对象的序列化与反序列化的作用?

利用对象的序列化与反序列化可以实现轻量级持久性(lightweight persistent)。”持久性“意味着一个对象的生存周期不取决于程序是否在运行;”轻量级“意味着我们不能让系统自动维护该过程,相反,对象必须在程序中显式序列化和反序列化还原。

对象序列化的概念加入到语言中是为了支持两种特性。一是Java的远程方法调用(Remote Method Invocation,RMI);二是为了配置程序的状态信息,如使用一个Bean时,一般是在设计阶段对它的状态信息进行配置,状态信息需要保存下来,在程序启动后进行后期恢复。

3.如何序列化和反序列化一个对象?

Java的I/O体系中主要提供了ObjectOutputStreamObjectInputStream两个类以供开发者使用,它们的基本使用思路有以下步骤。
1)让需要序列化的类实现java.io.Serializable接口,该接口仅仅是一个标记接口,不包括任何方法。
2)提供静态的long型的常量serialVersionUID。
3)如果是序列化对象,则用一个输出流创建一个ObjectOutputStream对象,然后调用writeObject()方法。
4)如果是反序列化一个对象,首先使用一个输入流创建一个ObjectInputStream对象,然后调用readObject()方法,得到一个Object类型的对象,最后再做类型的强制转换。
5)关闭流。

看下面的例子。

//学生类,实现Serializable接口
class Student implements Serializable {
    //序列化ID
    private static final long serialVersionUID  = 1L;
    private String name;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }
}

public class SerialTest{
    public static void main(String[] args) throws IOException, ClassNotFoundException{
        Student stu = new Student();
        stu.setName("justright");
        //创建一个对象输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/obj.dat"));
        //把对象写入输出流
        oos.writeObject(stu);
        //关闭流
        oos.close();

        //创建一个对象输入流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/obj.dat"));
        //读出已经序列化的对象并进行强制类型转换
        Student stuCopy = (Student)ois.readObject();
        //关闭流
        ois.close();
        //打印数据
        System.out.println(stuCopy.getName());
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java对象序列化与反序列化

Java对象转换为字节序列的过程称为序列化,用途是对象永久保存、传输。序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化...
  • BonJean
  • BonJean
  • 2016年07月25日 22:59
  • 2512

xstream ---java序列化到xml,xml反序列化到java对象(一)

一、简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象、Json数据的转换。它不需要schema或其他的mapping文件就可以进行java对象和xml...
  • u014520047
  • u014520047
  • 2016年09月01日 13:32
  • 891

java JSONObject对象序列化与反序列化

首先需要导入一下包 json-lib-2.3-jdk15.jar  commons-beanutils-1.7.0.jar  commons-httpclient-3.1.jar  commons-l...
  • Mr_linjw
  • Mr_linjw
  • 2016年02月17日 17:08
  • 5252

将java对象存储到redis数据库(使用序列化和反序列化)

redis不支持直接将java对象存储到数据库中,所以需要将java对象进行序列化得到字节数组,然后将字节数组存入到redis中,需要数据的时候就从redis数据库中取出字节数组,再经过反序列化将自己...
  • xiaobao5214
  • xiaobao5214
  • 2016年08月10日 11:58
  • 10016

Java对象的XML序列化和反序列化 - (6)

使用JAXB对Java对象进行XML序列化和反序列化的限制: 1. Java对象必须有无参的公有构造函数; 2. 只有公有成员和具有getter/setter的非公有成员才能被XML序列化和反序列...
  • kingfox
  • kingfox
  • 2012年10月20日 19:34
  • 1215

Java对象的XML序列化和反序列化 - (3)

在Java对象的XML序列化和反序列化(1)和Java对象的XML序列化和反序列化(2)介绍了利用java.beans.XMLEncoder/XMLDecoder实现Java对象的XML序列化和反序列...
  • kingfox
  • kingfox
  • 2012年10月18日 21:33
  • 4998

java对象序列化与反序列化中的构造方法问题

老规矩,先上代码再总结:import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcept...
  • Deep_Mind
  • Deep_Mind
  • 2016年07月27日 21:28
  • 1509

hessian学习基础篇——序列化和反序列化

hessian学习基础篇——序列化和反序列化 博客分类:  Java编程 OS  1、概念介绍    把Java对象转换为字节序列的过程称为对象的序列化。    把...
  • vasal
  • vasal
  • 2016年06月15日 15:31
  • 2985

把对象序列化为xml格式和反序列化

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System...
  • kexianjun66
  • kexianjun66
  • 2017年11月13日 11:37
  • 125

java序列化反序列化ArrayList集合

/** * 生成序列化 * * @throws IOException */ public void serialization() throws I...
  • u010504185
  • u010504185
  • 2016年11月26日 11:37
  • 1589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java对象的序列化与反序列化
举报原因:
原因补充:

(最多只允许输入30个字)