对象的序列化

对象的序列化

  • 什么是序列化,如何使类实现序列化
  • 如何将对象写进文件
  • 什么是类中的transient成员域
  • 如何将基本的数据类型写入对象文件
  • 如何实现serializable接口
  • 如果某个类含有默认不可序列化的对象,那么如何使该类可序列化。

在文件中存储对象

  • 序列化:在外部文件中存储获取对象的过程。
  • 将文件写入文件称为对象序列化,而从文件读取对象称为对象逆序列化
  • 任何类型的数组都是一个对象并且是可以被序列化的对象
  • 序列 化涉及到java.io包中的两个类,ObjectInputStream和ObjectOutputStream
   FileOutputStream outstream = new FileOutputStream("C:/files/pass.txt");
   BufferedOutputStream bof = new BufferedOutputStream(outstream);
   ObjectOutput out = new ObjectOutputStream(bof);

将对象写入文件的三个基本条件

  1. 该类必须被声明为public
  2. 该类必须实现serializable接口
  3. 如果该类有直接或间接的不可序列化的基类,那么该类不需要有一个默认的构造函数-----不需要实参的构造函数
  • 为了将一个对象写入文件,必须要调用ObjectOut的writeObject()方法,并将要写入的对象的引用作为实参传递进去。

实现seriaLizable接口,并将文件写入文件(对象序列化)

  • 第一步
   public class NameGeneratorTest1  implements Serializable{ 
        private String name;
        private String password;
   }
  • 第二步:将对象写入文件
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class CopyOfNameGeneratorTest3  implements Serializable{
	
	public static void main(String[] args) throws IOException {
		
		NameGeneratorTest1 nt =new NameGeneratorTest1();		
		FileOutputStream fout;
		try {
			fout = new FileOutputStream("C:/files/out.txt");
			BufferedOutputStream bot = new BufferedOutputStream(fout);
			ObjectOutput oPut = new ObjectOutputStream(bot);
			oPut.writeObject(nt);
			//刷新输出流
			oPut.flush();
			//关闭对象输出流
			oPut.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}		
	}

}

类的transient成员
若类中含有不可序列化的成员域,或者不希望将某些成员写入流,可以将它们声明为 transient
例如
    public class NameGeneratorTest1  implements Serializable{
	      transient private Integer age = 23;

从文件中读取对象(对象逆序列化)

		System.out.println("~~~~~~~~~~对象的逆序列化~~~~~~~~~~~");
		FileInputStream fis = new FileInputStream("C:/files/out.txt");
		BufferedInputStream bif = new BufferedInputStream(fis);
		ObjectInput oit = new ObjectInputStream(bif);
		NameGeneratorTest1 nametest =null;

	    nametest = (NameGeneratorTest1)oit.readObject();	
        System.out.println(nametest);
		oit.close();
  • 确定由逆序列化得到的对象的类
  1. 第一种方法
  • 不能确切的知道该类的引用,只有大致了解
        NameGeneratorTest1 nametests=null;
		nametests = (NameGeneratorTest1)oit.readObject();
	    if(nametests instanceof NameGenerator) {
	    	//如果是则强制转换为NameGenerator类型
	    }
	    if(nametests instanceof NameGenerators) {
	    	//如果是则强制转换为NameGenerators类型
	    }
  1. 第二种方法
  • 如果需要绝对的确定对象的类型
         /**
	     * getClass()方法,返回一个Class对象的引用,该引用表示该对象的类
	     * getName()   调用Class对象的getName方法,返回该类的完整类名
	     */
	    if(nametest.getClass().getName().equals(NameGenerator)) {
	    	//强制转换
	    }else if(nametest.getClass().getName().equals(OtherObject)) {
	    	//强制转换
	    }
  • 从对象流读取基本数据
  1. ObjectInputStream类定义了DataInput接口中的方法,用来从对象流和二进制值读取基本数据类型。

使用对象序列化

  • 将链表序列化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值