java 对象序列化与反序列化

Java序列化与反序列化是什么?

为什么需要序列化与反序列化?

如何实现Java序列化与反序列化?

本文围绕这些问题进行了探讨。

1.Java序列化与反序列化

   Java序列化是指把Java对象转换为字节序列的过程;

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

2.为什么需要序列化与反序列化

  我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

  当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

3.如何实现Java序列化与反序列化

  1)JDK类库中序列化API

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

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

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

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

  2)实现序列化的要求

  只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。

  3)实现Java对象序列化与反序列化的方法

  假定一个Student类,它的对象需要序列化,可以有如下三种方法:

    方法一:若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化

        ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。

        ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。

    方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),

        则采用以下方式进行序列化与反序列化。

        ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。

        ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

    方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,

        则按照以下方式进行序列化与反序列化。

        ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。

        ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

  4)JDK类库中序列化的步骤

    步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

        ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));

    步骤二:通过对象输出流的writeObject()方法写对象:

        out.writeObject(“Hello”);

        out.writeObject(new Date());

   5)JDK类库中反序列化的步骤

    步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

        ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));

    步骤二:通过对象输出流的readObject()方法读取对象:

        String obj1 = (String)in.readObject();

        Date obj2 = (Date)in.readObject();

    说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。

    为了更好地理解Java序列化与反序列化,选择方法一编码实现。

    Student类定义如:

      public class Student implements Serializable {//get/set/construct          private String name;          private char sex;          private int year;          private double gpa;      }  把Student类的对象序列化到文件O:\\Java\\com\\jieke\\io\\student.txt,  并从该文件中反序列化,向console显示结果。代码如下:
  public static void main(String[] args)  {      Student st = new Student("Tom",‘M‘,20,3.6);      File file = new File("O:\\Java\\com\\jieke\\io\\student.txt");      file.createNewFile();      //Student对象序列化过程        FileOutputStream fos = new FileOutputStream(file);      ObjectOutputStream oos = new ObjectOutputStream(fos);      oos.writeObject(st);      oos.flush();      oos.close();      fos.close();

  //Student对象反序列化过程         FileInputStream fis = new FileInputStream(file);      ObjectInputStream ois = new ObjectInputStream(fis);      Student st1 = (Student) ois.readObject();      System.out.println("name = " + st1.getName());      System.out.println("sex = " + st1.getSex());      System.out.println("year = " + st1.getYear());      System.out.println("gpa = " + st1.getGpa());      ois.close();      fis.close();}结果如下所示:

  name = Tom

  sex = M

  year = 20

  gpa = 3.6

总结:

  1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。

  2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。

 
				
时间: 2024-12-23 11:14:52

java 对象序列化与反序列化的相关文章

Java对象序列化和反序列化

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

Java对象序列化与反序列化

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

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

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

java对象序列化、反序列化

平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化.换句话说,序列化只是表示对象的一种方式而已.OK,有了序列化,那么必然有反序列化,我们先看一下序列化.反序列化是什么意思. 序列化:将一个对象转换成一串二进制表示的字节数组,通过保存或转移这些字节数据来

Java对象序列化与反序列化(1)

序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以被保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象.序列化机制使得对象可以脱离程序的运行而独立存在. 对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象.如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的(serializable),为了让某个类是可序列化的,该类必须实现如下两个接口之一: (1)Se

Java的序列化与反序列化

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

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

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

Java对象序列化/反序列化的注意事项(转)

Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久化的,将运行中的对象状态保存下来(最直接的方式就是保存到文件系统中),在需要的时候可以还原,即使是在Java虚拟机退出的情况下. 对象序列化机制是Java内建的一种对象持久化方式,可以很容易实现在JVM中的活动对象与字节数组(流)之间进行转换,使用得Java对象可以被存储,可以被网络传输,在网络的一

java对象序列化小结

百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据.确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission.在默认策略下,通过 Internet 下载