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

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 + "]";
}

}

猜你喜欢

转载自blog.csdn.net/qq_30347133/article/details/83513366