ToB企服应用市场:ToB评测及商务社交产业平台

标题: 文件输入和输入出处理(六)-序列化和反序列化 [打印本页]

作者: 半亩花草    时间: 2022-6-23 13:14
标题: 文件输入和输入出处理(六)-序列化和反序列化
序列号
序列化对象类
  1. //如果要支持序列化操作必须实现序列化接口
  2. //账户类
  3. public class Account implements Serializable {
  4.         //手动生成序列号
  5.     private static final long serialVersionUID = 2116137267832764072L;
  6.    
  7.     //账户名
  8.     private  String aname;
  9.     //账户密码
  10.     private String apwd;
  11.    
  12.     //set,get方法省略
  13.    
  14.     @Override
  15.     public String toString() {
  16.         return "Account{" +
  17.                 "aname='" + aname + '\'' +
  18.                 ", apwd='" + apwd + '\'' +
  19.                 '}';
  20.     }
  21. }   
复制代码
IDEA如何生成序列号
序列化
使用ObjectOutputStream 类的 writeObject(Object obj)方法
  1. //序列化对象,写入文件
  2. public static void xlhAccount() throws IOException {
  3.     Account account = new Account("KH96","12345");
  4.     //使用对象输出流,将内存中的对象写入到文件
  5.     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/test/account.txt"));
  6.    
  7.     //直接写入对象
  8.     oos.writeObject(account);
  9.     oos.close();
  10.     System.out.println("序列化对象写入成功");
  11. }
复制代码
序列化结果

反序列化
使用 ObjectInputStream 类的 readObject()方法
  1. //反序列化目标对象读取写入序列化的文件,进行反序列化,变为写入的那个目标对象
  2. public static void fxlhAccount() throws IOException, ClassNotFoundException {
  3.     //使用对象输入流,读入写入了序列化对象的文件
  4.     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/test/account.txt"));
  5.    
  6.     Account account = (Account) ois.readObject();
  7.     ois.close();
  8.    
  9.     //输出目标对象
  10.     System.out.println(account.toString());
  11.     System.out.println("读取序列化对象,反序列化成功");
  12. }
复制代码
反序列化结果
  1. Account{aname='KH96', apwd='12345'}
  2. 读取序列化对象,反序列化成功
复制代码
当类发生改变
改变后的序列化对象
  1. //账户类
  2. public class Account implements Serializable {
  3.         //手动生成序列号
  4.     private static final long serialVersionUID = 2116137267832764072L;
  5.    
  6.     //账户名
  7.     private  String aname;
  8.    
  9.     //账户密码
  10.     private String apwd;
  11.     //添加手机
  12.     private  String atel;
  13.    
  14.     //set,get方法省略
  15.    
  16.     @Override
  17.     public String toString() {
  18.         return "Account{" +
  19.                 "aname='" + aname + '\'' +
  20.                 ", apwd='" + apwd + '\'' +
  21.                 ", atel='" + atel + '\'' +
  22.                 '}';
  23.     }
  24. }
复制代码
反序列化结果
  1. Account{aname='KH96', apwd='12345', atel='null'}
  2. 读取序列化对象,反序列化成功
复制代码
如果没有手动声明序列号,实体类发生改变后就会java.io.InvalidClassException异常,序列号不一致而无法进行序列化。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4