标签:ObjectOutputStream writeObject ObjectInputStream readObject Serializable
(一)序列化 ObjectOutputStream1.序列化
把对象以数据流的形式存储在介质上的过程就是序列化,对象不会随着虚拟机或者程序退出而消失掉
2.结构
java.lang.Object
继承者 java.io.OutputStream
继承者 java.io.ObjectOutputStream
3.构造方法
new ObjectOutputStream(OutputStream out)
OutputStream out : 使用的是字节流
new ObjectOutputStream(new FileOutputStream("E:/obj.txt"));
4.方法
writeObject(Object obj) 将指定的对象写入 ObjectOutputStream
5.实际使用
(1)如果想序列化User类对象,那么User类必须实现"序列化接口(Serializable)"
(2)给类生成一个指定的序列化版本ID,如果这个类的内容发生了变化,不会影响反序列化
private static final long serialVersionUID = -4743372914435189725L;
(3)多个User对象写入ArrayList集合中,再执行序列化,ArrayList也实现了Serializable接口
(二)反序列化 ObjectInputStream
1.反序列化
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化
2.结构
java.lang.Object
继承者 java.io.InputStream
继承者 java.io.ObjectInputStream
3.构造方法
new ObjectInputStream(InputStream in)创建从指定 InputStream 读取的 ObjectInputStream。
InputStream in : 使用的是字节流
new ObjectInputStream(new FileInputStream("E:/obj.txt"));
4.方法
readObject() 从 ObjectInputStream 读取对象==》返回 Object
5.实际使用
反序列化User类对象,如果User类(修改原有内容)新加个方法,那么反序列化时的序列号(版本号)跟之前序列化时的版本号对应不上,就无法反序列化
代码1:User类
import java.io.Serializable;
public class User implements Serializable{
/**
* 给类生成一个指定的序列化版本ID,如果这个类的内容发生了变化,不会影响反序列化
*/
private static final long serialVersionUID = -4743372914435189725L;
private String name;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}代码2:单个User对象序列化
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main_ObjectOutputStream {
public static void main(String[] args) {
writeObject();
readObject();
}
// 单个User对象序列化
public static void writeObject() {
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream("E:/obj.txt"));
User user=new User();
user.setName("www");
user.setAge(20);
oos.writeObject(user);
/**
* 文件写入内容
* ooxxnulloppxxxj <瞎写和乱码因为这里的文件不需要我们去读懂>
* */
} catch (FileNotFoundException e) {
System.out.println("【异常】未找到文件");
e.printStackTrace();
} catch (IOException e) {
System.out.println("【异常】IO出错");
e.printStackTrace();
} finally {
if(oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("end");
}
public static void readObject() {
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(new FileInputStream("E:/obj.txt"));
Object obj=ois.readObject();
User user=(User) obj;
String name=user.getName();
int age =user.getAge() ;
System.out.println(name+":"+age);
/**
* 输出内容 :
* www:20
* */
} catch (FileNotFoundException e) {
System.out.println("【异常】未找到文件");
e.printStackTrace();
} catch (IOException e) {
System.out.println("【异常】IO出错");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("【异常】未找到类异常");
e.printStackTrace();
} finally {
if(ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("end");
}
}代码3:多个User对象写入集合中,再执行序列化
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.util.ArrayList;
public class Main_ObjectOutputStream_ArrayList {
public static void main(String[] args) {
writeObject();
readObject();
}
// 多个User对象写入集合中,再执行序列化
public static void writeObject() {
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream("E:/obj_list.txt"));
User user1=new User();
user1.setName("www");
user1.setAge(20);
User user2=new User();
user2.setName("yyy");
user2.setAge(30);
ArrayList<User> list=new ArrayList<User>();
list.add(user1);
list.add(user2);
oos.writeObject(list);
/**
* 文件写入内容
* ooxxnulloppxxxj <瞎写和乱码因为这里的文件不需要我们去读懂>
* */
} catch (FileNotFoundException e) {
System.out.println("【异常】未找到文件");
e.printStackTrace();
} catch (IOException e) {
System.out.println("【异常】IO出错");
e.printStackTrace();
} finally {
if(oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("end");
}
public static void readObject() {
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(new FileInputStream("E:/obj_list.txt"));
Object obj=ois.readObject();
ArrayList<User> list=(ArrayList<User>) obj;
for(User u:list) {
System.out.println(u.getName()+":"+u.getAge());
//输出内容
//www:20
//yyy:30
}
} catch (FileNotFoundException e) {
System.out.println("【异常】未找到文件");
e.printStackTrace();
} catch (IOException e) {
System.out.println("【异常】IO出错");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("【异常】未找到类异常");
e.printStackTrace();
} finally {
if(ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("end");
}
}标签:ObjectOutputStream writeObject ObjectInputStream readObject Serializable
原文地址:http://blog.51cto.com/13634837/2091415