Java序列化和反序列化

1 Java序列化和反序列化

Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。

序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台无关,这意味着您可以序列化平台中的对象并在不同平台中反序列化。

为了序列化对象,我们调用ObjectOutputStream类的writeObject()方法,而反序列化,我们调用ObjectInputStream类的readObject()方法。

不管是序列化还是反序列化,对象都必须实现Serializable接口。

2 Java序列化的优点

Java序列化主要用于在网络上传播对象(称为封送处理)。

3 java.io.Serializable接口

Serializable是标记接口(接口没有任何的属性和方法)。它用于“标记”Java类,以便这些类的对象可以具有一定的功能。Cloneable和Remote也是标记器接口。

默认情况下,String类和所有包装类都实现java.io.Serializable接口。

让我们看下面的例子:

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 *  Java Serializable的例子
 */
import java.io.Serializable;

public class Student implements Serializable{
    int id;
    String name;
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

在上面的示例中,Student类实现了Serializable接口。现在可以将其对象转换为流。

4 Java ObjectOutputStream

ObjectOutputStream类用于将原始数据类型和Java对象写入OutputStream。只有实现java.io.Serializable接口的对象才能写入流。

4.1 ObjectOutputStream构造方法

构造方法 描述
public ObjectOutputStream(OutputStream out) throws IOException {} 创建一个ObjectOutputStream写入指定的OutputStream。

4.2 ObjectOutputStream方法

方法 描述
public final void writeObject(Object obj) throws IOException {} 将指定的对象写入ObjectOutputStream。
public void flush() throws IOException {} 刷新当前输出流。
public void close() throws IOException {} 关闭当前输出流。

5 Java ObjectInputStream

ObjectInputStream反序列化使用ObjectOutputStream编写的对象和原始数据。

5.1 ObjectInputStream构造方法

构造方法 描述
public ObjectInputStream(InputStream in) throws IOException {} 创建一个ObjectInputStream,它从指定的InputStream读取。

5.2 ObjectInputStream方法

方法 描述
public final Object readObject() throws IOException, ClassNotFoundException{} 从输入流中读取一个对象。
public void close() throws IOException {} 关闭Ob​​jectInputStream。

6 Java序列化的例子

在此示例中,我们将序列化Student类的对象。ObjectOutputStream类的writeObject()方法提供了序列化对象的功能。我们将对象的信息保存在file.txt文件中。

Student.java:

package com.yiidian;

import java.io.Serializable;

/**
 *一点教程网: http://www.yiidian.com
 */
public class Student implements Serializable{
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

Demo.java:

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 *  Java 序列化的例子
 */

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Demo{
    public static void main(String args[]){
        try{
            //Creating the object
            Student s1 =new Student(211,"eric");
            //Creating stream and writing the object
            FileOutputStream fout=new FileOutputStream("file.txt");
            ObjectOutputStream out=new ObjectOutputStream(fout);
            out.writeObject(s1);
            out.flush();
            //closing the stream
            out.close();
            System.out.println("success");
        }catch(Exception e){System.out.println(e);}
    }
}

输出结果为:

success

7 Java反序列化的例子

反序列化是从序列化状态重建对象的过程。这是序列化的反向操作。让我们看一个示例,该示例从反序列化的对象读取数据。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 *  Java 反序列化的例子
 */
import java.io.*;

class Demo{

    public static void main(String args[]){
        try{
            //Creating stream to read the object
            ObjectInputStream in=new ObjectInputStream(new FileInputStream("file.txt"));
            Student s=(Student)in.readObject();
            //printing the data of the serialized object
            System.out.println(s.getId()+" "+s.getName());
            //closing the stream
            in.close();
        }catch(Exception e){System.out.println(e);}
    }
}

输出结果为:

211 eric

 

热门文章

优秀文章