Java对象流与序列化学习

对象流与序列化

对象流有两个类

  • ObjectOutputStream:将java对象的基本数据类型和图形写入OutputStream
  • ObjectInputStream:对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。

序列化一组对象

同时序列化多个对象时,反序列化也必须按顺序操作,如果想要序列化一组对象该如何操作呢?

  • 序列化一组对象可采用:对象数组的形式,因为对象数组可以向Object进行转型操作。

transient关键字

  • 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。

能序列化的要求

  • 如果一个类创建的对象,需要被序列化,那么该类必须实现Serializable接口。
  • Serializable接口是一个标记接口,没有任何定义。
  • 如果对象没有实现该接口,会抛出java.io.NotSerializableException

什么时候需要被序列化呢?

  • 把文件保存到文件中,存储到物理介质
  • 对象需要在网络上传输

示例代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;

import org.junit.Test;


public class ObjectStreamDemo {

	/**
	 * 对象反序列化,将对象从文件读到程序
	 */
	@Test
	public void readObject() {
		File file = new File("F:/dog.obj");
		try {
			InputStream in = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(in);

			Dog dog = (Dog) ois.readObject();
			System.out.println(dog);
			ois.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}// readObject

	/**
	 * 对象序列化:实际写入的是类名、属性名、属性类型、属性值等
	 * 将对象写入到文件
	 */
	@Test
	public void writeObject() {
		Dog dog = new Dog("Tom", "男", 2);
		File file = new File("F:/dog.obj");

		try {
			OutputStream out = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(out);

			oos.writeObject(dog);
			oos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}// writeObject
}

需要被序列化的Dog类,必须实现标记接口Serializable

class Dog implements Serializable {

	// 序列号,保证读取时的编号和存储时的一致,方能读取
	private static final long serialVersionUID = -3094355583246045443L;
	private String name;
	private String sex;
	private int age;
	private transient int id;// 在序列化时被忽略

	public Dog() {}
	public Dog(String name, String sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
	@Override
	public String toString() {
	return "Dog [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
posted on 2019-05-16 19:24  行之间  阅读(126)  评论(0编辑  收藏  举报