文件输入和输入出处理(六)-序列化和反序列化

打印 上一主题 下一主题

主题 608|帖子 608|积分 1824

序列号

  • 序列号是序列化和反序列化的唯一标识,是一个长整型数值;
  • 如果类中不自己定义序列号,系统会自动生成一个序列号;
  • 当一方实体类发生改变,而调用方的序列号是不会跟着改变的,不知道对象已修改,会导致两边序列号不一致,反序列化失败;
  • 所以要求必须手动生成一个序列号;
  • 手动生成序列号后,可以解决目标类发生改变,不影响接口调用,对象可以正确序列化,不过对象修改的属性返序列化后没有值;
序列化对象类
  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异常,序列号不一致而无法进行序列化。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表