Java IO流->处理流->对象流:ObjectOutputStream&ObjectInputStream

图一:

图二:

图三:

图四:


示例代码:

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

import org.junit.Test;

public class TestObjectInputOutputStream {
	/*
	 * 对象的序列化过程:将内存中的对象通过ObjectOutputStream转换成二进制流,存储在硬盘文件中
	 */
	@Test
	public void test1() {
		TestObject t1 = new TestObject("小花",23,new TestSubObject("小明"));
		TestObject t2 = new TestObject("小呆",22,new TestSubObject("大呆"));
		
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
			oos.writeObject(t1);
			oos.writeObject(t2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(oos != null) {
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/*
	 * 对象的反序列化过程:将硬盘中的文件通过ObjectInputStream转换成相应的对象
	 */
	@Test
	public void test2() {
		 ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(new FileInputStream("oos.txt"));
			 TestObject p1 = (TestObject) ois.readObject();
			 System.out.println(p1);
			 TestObject p2 = (TestObject) ois.readObject();
			 System.out.println(p2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(ois != null) {
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		 
	}
}

/*
 * 要实现序列化的类:
 * 1.要求此类是可序列化的,实现Serializable接口
 * 2.要求类的属性同样的要实现Serializable接口
 * 3.提供一个版本号:private static final long serialVersionUID
 * 4.使用static或transient修饰的属性,不可实现序列化(不会报错,但是值都是空的)
 */
class TestObject implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 435658857576587L;
	String name;//String类已实现Serializable接口
	int age;//Integer类的父类Number类已实现Serializable接口
	TestSubObject t;//TestSubObject也需要实现Serializable接口
	
	public TestObject(String name, int age , TestSubObject t) {
		super();
		this.name = name;
		this.age = age;
		this.t = t;
	}

	@Override
	public String toString() {
		return "TestObject [name=" + name + ", age=" + age + ", t=" + t + "]";
	}
}

class TestSubObject implements Serializable {
	String name;

	public TestSubObject(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		return "TestSubObject [name=" + name + "]";
	}
}


猜你喜欢

转载自blog.csdn.net/u013453970/article/details/48023009
今日推荐