对象序列化的学习

在之前的IO流学习中,已经大概知道了如何去操作文件中的数据,但是,操作的内容还局限于字符串或者是文件的字节流,如果想把程序中创建的对象也保存起来,该怎么办呢?

对此,java的IO包中给我们提供了一组类,专门用来操作程序中生成的对象,分别是ObjectInputStream和ObjectOutputStream,而对于对象的保存和获取,成为对象的序列化


根据之前IO流的学习可知,ObjectOutputStream是用来保存对象到文件中的,ObjectInputStream是用来从文件中获取对象的


1,ObjectInputStream

构造函数:ObjectInputStream(InputStream in)

关键方法:readObject()//用来获取对象


2,ObjectOutputStream

构造函数:ObjectOutputStream(OutputStream out)

关键方法:writeObject()//用来写入对象到文件中


3,Serializable:这是一个标记接口,如果要序列化的对象的类没有实现该接口,是不能被序列化的,实现该接口并不需要重写任何方法,实现该接口只是为了根据类的属性和方法来生成一个辨别码,称为UID(一个long型数),序列化过程就是根据这个UID来实现的


演示1(输出)

代码:

定义一个类:

import java.io.*;
class Person implements Serializable
{
	String name;
	int age;
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}

输出操作:

import java.io.*;
class ObjectOutputStreamDemo 
{
	public static void main(String[] args) throws IOException
	{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("person.object"));
		Person p=new Person("lisi",50);

		oos.writeObject(p);
		oos.close();
	}
}

成功生成文件:




演示2(输入):

代码:

import java.io.*;
class ObjectInputStreamDemo 
{
	public static void main(String[] args) throws IOException,ClassNotFoundException //readObject方法会抛出ClassNotFoundException
	{
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("person.object"));

		Person p=(Person)ois.readObject();

		System.out.println(p.name+" : "+p.age);
	}
}
/*
结果:
lisi : 50
*/


演示3(修改类):

假如把对象保存后,再把对象所属类进行修改,那么还能正常获取对象吗?

修改Person:

import java.io.*;
class Person implements Serializable
{
	String name;
	int age;
	String country;//加上国籍
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}

结果:


既然知道是UID的问题,那么如果在类中自定义UID能不能解决这个问题呢?


Person(修改前):

import java.io.*;
class Person implements Serializable
{
	static final long serialVersionUID=15L;//类型必须和Serializable接口中定义的一致
	String name;
	int age;
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}
先读一次(在读之前ObjectOutputStreamDemo,ObjectInputStreamDemo,Person这三个java文件都要重新编译,运行):



Person(修改后):

import java.io.*;
class Person implements Serializable
{
	static final long serialVersionUID=15L;//类型必须和Serializable接口中定义的一致
	String name;
	int age;
	String country;//加上国籍
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}

第二次读的结果:



没问题。


补充:在对象的序列化过程中,类中的静态成员不会被序列化,如果非静态成员也不希望被序列化,要在开头加关键字transient,所谓的不被序列化就是指在保存对象时不被序列化的部分不会被保存,获取对象时,未被序列化的部分以当前值为准








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值