欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO的应用(二)--序列化与反序列化

程序员文章站 2022-04-09 13:09:52
...

package com.bjpowernode.demo02;

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;

/**

    1. 对象序列化
  •  把对象转换为01二进制序列就是对象序列化
    
  •  一般会把01序列保存到文件中, 使用ObjectOutputStream类
    
    1. 对象反序列化
  •  把01序列转换为对象就是对象的反序列化
    
  •  一般是从文件中把01序列读出来转换为对象, 使用ObjectInputStream类
    
    1. 对象如果要进行序列化/反序列化, 对象的类必须实现Serializable接口
  •  Serializable接口是一想 标志接口,没有任何方法, 
    
    1. 一般情况下,类实现了Serializable接口后,会手动的添加serialVersionUID字段, 防止反序列化出现异常
  •  private static final long serialVersionUID = -564123146743165710L;
    

*/
public class Test04 {

public static void main(String[] args) throws IOException, ClassNotFoundException {
	Person p1 = new Person("lisi", 18);
	//对象序列化,简单的可以理解为把对象保存到文件中

// saveObject( p1 );

	Object obj = readObject();
	System.out.println( obj );
	/*
	 * 把对象保存到文件之后  ,又修改了类的结构, 再进行反序列化时, 就会出现异常 java.io.InvalidClassException:
	 * 	 com.bjpowernode.demo02.Person; local class incompatible: 
	 * 	stream classdesc serialVersionUID = -3136557166480575792, 
	 * 	local class serialVersionUID = 198229193265816609
	 * 分析:
	 * 		类实现了Serializable接口后,系统会自动生成一个字段serialVersionUID
	 * 		当在类中添加了字段,修改了类的结构,  再次编译后,会生成一个新的serialVersionUID的字段值
	 * 		再进行反序列化时, 两个serialVersionUID字段值不相同, 就会产生异常
	 * 解决方法:
	 * 		保证在序列化和反序列化时, serialVersionUID字段的值一样即可
	 * 		可以手动的添加serialVersionUID字段
	 */
}

// 对象反序列化, 简单的理解为就是从文件中把对象读取出来
private static Object readObject() throws IOException, ClassNotFoundException {
	InputStream in = new FileInputStream("d:/obj.txt");
	ObjectInputStream ois = new ObjectInputStream(in);
	Object obj = ois.readObject();
	ois.close();
	return obj;
	
	/*try {
		return ois.readObject();
	} finally {
		ois.close();
	}*/
}

//对象序列化
private static void saveObject(Object obj) throws IOException {
	OutputStream out = new FileOutputStream("d:/obj.txt");
	ObjectOutputStream oos = new ObjectOutputStream(out);
	oos.writeObject(obj);
	oos.close();
}

}
//一般情况下,类实现了Serializable接口后,会手动的添加serialVersionUID字段
class Person implements Serializable{
String name;
int age;
String gender = “男”;

//手动的定义一个序列化版本号
private static final long serialVersionUID = -564123146743165710L;


public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}


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

}

相关标签: IO