Java学习笔记二十五(IO流之ObjectOutputStream和ObjectInputStream类)

ObjectOutputStream和ObjectInputStream类

这两个流是用来将对象写入到文件中,或者从文件中读取一个对象,都是高级流。

在这两个类的使用过程中,涉及到序列化与反序列化的问题。

序列化:将对象转化成字节数组写入到文件中的过程。

反序列化:将字节数组转换成对象读入到程序的过程。

实现序列化和反序列化的要求是:该对象对应的类,必须实现序列化的接口(实现序列化的接口不需要重写任何方法,因为该接口中没有抽象方法,但是必须实现此接口表明当前的类可以被序列化和反序列化)。

写入对象的简单实现

public class TestObjectOutputStream {
	public static void main(String[] args) throws IOException {
		Person p = new Person("张三",23,3000);
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\keshe\\person.obj"));
		oos.writeObject(p);
	}
}

读出对象的简单实现

public class TestObjectInputStream {
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\keshe\\person.obj"));
		Person p = (Person)ois.readObject();
		System.out.println(p);
		ois.close();
	}
}

被写入和读出的类

public class Person implements Serializable{
	private static final long serialVersionUID = -6764416307607687218L;   //版本号
	String name;
	transient int age;          
	int salaxy;
	public Person() {
		super();
	}
	public Person(String name, int age, int salaxy) {
		super();
		this.name = name;
		this.age = age;
		this.salaxy = salaxy;
	}
	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;
	}
	public int getSalaxy() {
		return salaxy;
	}
	public void setSalaxy(int salaxy) {
		this.salaxy = salaxy;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", salaxy=" + salaxy + "]";
	}
}

在这里要注意:上述程序中存在一个版本号,这个版本号需要显式指定,在读写版本号一致时才能进行正确的操作。

其中也出现了transient关键字,这个关键字表示的含义是忽略,在序列化到文件中时会忽略此被关键字修饰的属性,自然在反序列化时该属性也没有值。

猜你喜欢

转载自blog.csdn.net/weixin_40373090/article/details/82557820