序列化和反序列化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化和反序列化相关的知识,希望对你有一定的参考价值。
(一)序列化 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"); } }
以上是关于序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章