对象的序列化
什么是序列化,如何使类实现序列化 如何将对象写进文件 什么是类中的transient成员域 如何将基本的数据类型写入对象文件 如何实现serializable接口 如果某个类含有默认不可序列化的对象,那么如何使该类可序列化。
在文件中存储对象
序列化:在外部文件中存储 和获取 对象的过程。 将文件写入文件称为对象序列化 ,而从文件读取对象称为对象逆序列化 任何类型的数组都是一个对象并且是可以被序列化的对象 序列 化涉及到java.io包中的两个类,ObjectInputStream和ObjectOutputStream
FileOutputStream outstream = new FileOutputStream("C:/files/pass.txt");
BufferedOutputStream bof = new BufferedOutputStream(outstream);
ObjectOutput out = new ObjectOutputStream(bof);
将对象写入文件的三个基本条件
该类必须被声明为public 该类必须实现serializable接口 如果该类有直接或间接的不可序列化的基类,那么该类不需要有一个默认的构造函数-----不需要实参的构造函数
为了将一个对象写入文件,必须要调用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();
第一种方法
NameGeneratorTest1 nametests=null;
nametests = (NameGeneratorTest1)oit.readObject();
if(nametests instanceof NameGenerator) {
//如果是则强制转换为NameGenerator类型
}
if(nametests instanceof NameGenerators) {
//如果是则强制转换为NameGenerators类型
}
第二种方法
/**
* getClass()方法,返回一个Class对象的引用,该引用表示该对象的类
* getName() 调用Class对象的getName方法,返回该类的完整类名
*/
if(nametest.getClass().getName().equals(NameGenerator)) {
//强制转换
}else if(nametest.getClass().getName().equals(OtherObject)) {
//强制转换
}
ObjectInputStream类定义了DataInput接口中的方法,用来从对象流和二进制值读取基本数据类型。
使用对象序列化