Java基础(28)——对象的序列化详解及示例分析


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、对象的序列化

(1)什么是对象序列化

  前两篇我们学习了字节流与字符流,通过它们我们既可以把数据从硬盘中读取出来,也可以把数据储存在硬盘中,那么我们是否可以将我们在程序中创建的对象也存储在硬盘中呢?当然是可以的
  当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了。但是如果希望永久保存这些对象,则可以将对象转为字节数据写入到硬盘上并保存其信息,当对象将被重建时它并且拥有与程序上次运行时拥有的信息相同,这就是对象的序列化。
  基本的序列化由两个方法产生:一个方法用于序列化对象并将它们写入一个流,另一个方法用于读取流并反序列化对象,如下:
在这里插入图片描述

(2)API

  ObjectOutputStream和ObjectInputStream 对象分别需要字节输出流和字节输入流对象来构建对象,因此,这两个流对象可以将对象进行本地持久化存储
在这里插入图片描述

(3)Serializable接口

  实现javaio.Serializable接口的类将启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。所以需要被序列化的类必须是实现Serializable接口,该接口中没有描述任何的属性和方法,称之为标记接口。如果对象没有实现接口Serializable, 在进行序列化时会抛出NotSerializableException异常
  serialVersionUID用于给类指定一个UID。如果被序列化的对象需要被不同的类版本所兼容,可以在类中自定义serialVersionUID。定义方式:static final long serialVersionUID = 42L;

(4)案例:序列化和反序列化Dog对象

  代码及注释如下:

package qfbd.com;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Demo {

	public static void main(String[] args) throws Exception {
		//创建dog对象
		Dog dog = new Dog("贝贝", 2);
		
		//序列化
		FileOutputStream fileOutputStream = new FileOutputStream("D:"+File.separatorChar+"dog.txt");
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
		objectOutputStream.writeObject(dog);
		System.out.println("写入文件的对象:"+dog);
		objectOutputStream.flush();
		objectOutputStream.close();
		
		//反序列化
		FileInputStream fileInputStream = new FileInputStream("D:"+File.separatorChar+"dog.txt");
		ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
		Object readObject = objectInputStream.readObject();
		Dog dog2 = (Dog)readObject;
		System.out.println("从文件中读出的对象:"+dog2);
		objectInputStream.close();
	}
}

//实现Serializable接口并生成序列号
class Dog implements Serializable{
	private static final long serialVersionUID = 6634752521947304823L;
	public String name;
	public int age;
	public Dog() {
		// TODO Auto-generated constructor stub
	}
	//添加带参构造函数
	public Dog(String name,int age){
		this.name = name;
		this.age = age;
	}
	//重写toString方法
	@Override
	public String toString() {
		return "Dog[name="+name+",age="+age+"]";
	}
}

  执行结果如下:
在这里插入图片描述
  由上面的示例我们可以看出,我们将dog对象储存入了硬盘中,最后又读了出来,实现了对象的存储与读取
  关键点:
    (1)声明Cat类实现了Serializable 接口,是一个标示器,没有要实现的方法
    (2)新建Cat对象,对象中不想序列化的对象使用transient关键字修饰
    (3)新建字节流对象(FileOutputStream)进序列化对象保存在本地文件中
    (4)新建ObjectOutputStream对象,调用writeObject方法序列化Cat对象
    (5) writeObject方法会执行两个工作:序列化对象,然后将序列化的对象写入文件中
    (6)反序列化就是调用ObjectInputStream的readObject()方法
    (7)异常处理和流的关闭动作要执行
    (8)注意:序列化是递归的,如果对象中包含其它可序列化的对象,其它对象也会被序列化

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值