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是不会被序列化的。

时间: 2024-10-10 08:49:02

Java对象序列化原理以及Serializable接口的相关文章

Java对象为啥要实现Serializable接口?

导读 最近这段时间一直在忙着编写Java业务代码,麻木地搬着Ctrl-C.Ctrl-V的砖,在不知道重复了多少次定义Java实体对象时"implements Serializable"的C/V大法后,脑海中突然冒出一个思维(A):问了自己一句"Java实体对象为什么一定要实现Serializable接口呢?",关于这个问题,脑海中的另一个思维(B)立马给出了回复"居然问这么幼稚和基础的问题,实现Serilizable接口是为了序列化啊!",思维(

借助Intent实现Android工程中Activity之间Java对象的传递——实现Serializable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Serializable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import java.io.Serializable; public class User implements Seria

Java实体对象为什么要实现Serializable接口?

前言 Java实体对象为什么一定要实现Serializable接口呢?在学JavaSE的时候有些实体对象不实现Serializable不是也没什么影响吗? 最近在学习mybatis的时候发现,老师写的实体对象都实现了Serializable接口,我查了查网上说是实现Serilizable接口是为了序列化 先来看下Serializable接口 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法

【java】理解java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(2012.02.14最后更新) 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可

深入理解Java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(持续更新中,2012.02.13最后更新) 1. 什么是Java对象序列化 Java平台允许我们在

序列化Parcelable和Serializable接口的区别

 一.Parcelable和Serializable接口简介 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implem

理解Java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(2012.02.14最后更新) 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可

Java对象序列化和反序列化

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

java对象序列化小结

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