java对象序列化

时间:2023-01-02 12:31:50
1、序列化
  • Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
  • 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
  • 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

2、对象序列化条件
  • 该类必须实现 java.io.Serializable 对象。
  • 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂(transient)的。

3、java工具
  • 类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含序列化和反序列化对象的方法。
  • 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。

4、对象序列化实例
  • 对象必须实现Serializable接口
  • transient表明该字段序列化时忽略掉,即不写入文件
//可序列化对象
	static class B implements Serializable{
		int number;
		String name;
		transient Date d;
		
		public B(String name,int number) {
			this.name=name;
			this.number=number;
		}
		
		public void print() {
			System.out.println("name"+name+" number"+number);
		}
	}


5、对象序列化
//对象序列化
	public static void method() {
		B b=new B("a",1);
		try(
				FileOutputStream fos=new FileOutputStream("D:\\object.res");
				ObjectOutputStream oos=new ObjectOutputStream(fos);
			){
			oos.writeObject(b);
			System.out.println("already wirte class B");
		}catch(Exception e){
			e.printStackTrace();
		};
		
	}


6、对象反序列化
  • 读取出来的对象记得强制转换为原来的类型
  • 涉及的异常:IOException和ClassNotFoundException
//对象反序列化
	public static void method2() {
		B b = null;
		try(
			FileInputStream fis=new FileInputStream("D:\\object.res");
			ObjectInputStream ois=new ObjectInputStream(fis);
		){
			b=(B) ois.readObject();
		}catch(Exception e) {
			e.printStackTrace();
		}
		System.out.println(b.name);
	}