首页 > 代码库 > Java对象序列化原理以及Serializable接口

Java对象序列化原理以及Serializable接口

Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对象的传输和存储。

原理是:对象------------->转换----------------->将对象转变为二进制的数据

            在对象序列化时,只有其属性被序列化(每个对象都具备相同的方法,但是每个对象的属性不一定相同,也就是说对象保存的只有其属性信息)

那么一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下:

public interface Serializable {
}

    可以发现此接口没有定义任何的方法,此接口只是一个标识接口,表示一个类具备了别序列化的能力。

    如果要完成对象的输入或输出,必须依赖对象的输入流(ObjectInputStream)和 对象输出流(ObjectOutputStream)。

   1、使用对象输出流输出序列化对象的过程称之为序列化。

   2、使用对象输入流读入对象的过程称之为反序列话。

   程序-------------->ObjectOutputStream------------------->序列化对象<----------------------ObjectInputStream-----------------------------程序

                                         序列化                                                                                                         反序列化

  

   一、ObjectOutputStream对象输出流

      他是OutputStream字节数出流的子类,主要有如下方法:

       1、 public  ObjectOutputStream(OutputStream out) throw IOException  构造方法  如传入输出流对象

       2、 public final void writeObject(Object obj) throw IOException   输出对象

其实现如下:

定义一个序列化类。

package andy.serializable.test;

import java.io.Serializable;

/**
 * @author Zhang,Tianyou version:2014-11-20 下午2:41:12
 * 
 * 
 */

public class Student implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6095384564471868081L;

	// 实现serializable是指成为序列化类

	private String name;

	private int age;

	public Student() {
	}

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

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

将对象输出到文件d:tes.txt 文件中:

package andy.serializable.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

/**  
 * @author Zhang,Tianyou  
 * version:2014-11-20 下午2:45:24  
 * 
 *  
 */

public class ObjectOutputStreamTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File file = new File("d:" + File.separator + "test.txt");
		
		ObjectOutputStream oos = null;
		
		OutputStream outputStream = new FileOutputStream(file);
		
		oos = new ObjectOutputStream(outputStream);
		
		oos.writeObject(new Student("小明", 23));
		
		outputStream.close();
		
		oos.close();
	}

}

其二进制数据结果如下如下:



  二、ObjectInputStream对象输入流

          能够将被序列化的对象反序列话。是InputStream的子类,实例化是必须接受一个InputStream输入流对象。

   其主要方法如下:

          1、public ObjectInputStream(InputStream in) throw IOException  构造方法

          2、public final Object readObject() throw IOException, ClassNotFoundException 读取指定位置的对象

其实现如下:

package andy.serializable.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

/**
 * @author Zhang,Tianyou version:2014-11-20 下午2:45:46
 * 
 * 
 */

public class ObjectInputStreamTest {

	/**
	 * @param args
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		// TODO Auto-generated method stub
		File file = new File("d:" + File.separator + "test.txt");

		ObjectInputStream ois = null;

		InputStream inputStream = new FileInputStream(file);

		ois = new ObjectInputStream(inputStream);

		Object obj = ois.readObject();
		Student student = (Student) obj;

		ois.close();

		inputStream.close();

		System.out.println("test内容: name:" + student.getName() + "age:"
				+ student.getAge());

	}

}

运行如下:

test内容: name小明age:23


  三、也可以自定义序列化接口,可以指定自己希望序列化的内容,只需实现Externalizable接口。


 四、Serializable接口实现的操作实际是将一个对象的全部属性进行了序列化,当然也可以通过Externalizable接口实现部分属性的序列化,但更简便的方法是使用transient关键字声明不需要序列化的接口。

例如:

   private transient String name;

那么name是不会被序列化的。


Java对象序列化原理以及Serializable接口