zoukankan      html  css  js  c++  java
  • 序列化与反序列化

    定义:将类通过字节流的方式写入文件称为序列化,从类文件中通过字节流的方式读取出来称为反序列化

    序列化:类要实现Serializable接口,才能序列化,Serializable接口没有任何抽象方法,是一个标记接口

    try (ObjectOutputStream seri = new ObjectOutputStream(new FileOutputStream("persons.txt"))) {
    			
    			seri.writeObject(new Person("mili", 22));
    			seri.writeObject(new Person("lili", 21));
    

    反序列化:
    反序列化时,需要用Object 对象接收,然后向下转型

    try (ObjectInputStream unseri = new ObjectInputStream(new FileInputStream("persons.txt"))) {
    			
    			Object obj = unseri.readObject();
    

    反序列化时,如果readObject()次数超过了文件中总共的对象数就会报错

    解决办法:将所有对象添加到集合中,序列化时只序列化一个集合对象,反序列化时只读一个集合,然后遍历集合就能得到所有对象

    try (ObjectOutputStream seri = new ObjectOutputStream(new FileOutputStream("persons.txt"));
    				ObjectInputStream unseri = new ObjectInputStream(new FileInputStream("persons.txt"))) {
    			
    			Set<Person> set = new HashSet<>();
    			
    			set.add(new Person("mike", 22));
    			set.add(new Person("mili", 22));
    			set.add(new Person("lili", 21));
    			
    			seri.writeObject(set);
    			Object uset = unseri.readObject();
    			
    			for (Person person : (HashSet<Person>)uset) {
    				System.out.println(person);
    			}
    

    类的版本号问题:如果本地类型的版本ID和磁盘中的对象的类的版本ID不相同,就会发生InvalidClassException。避免:手动生成序列化版本ID,是否改变类型的版本,手动指定,不要自动生成
    手动指定版本号private static final long serialVersionUID = 1L;

  • 相关阅读:
    Maven学习
    Oracle_SQL函数-单行函数
    Java 8新特性-5 内建函数式接口
    量子优势
    配置Emeditor编译运行JAVA,附私家珍藏版
    配置Emeditor编译运行JAVA,附私家珍藏版
    Notepad2-mod,轻量级文本编辑器、代替记事本的最佳选择
    三星S7短信不能提示的处理方法
    三星S7短信不能提示的处理方法
    说说宾得机身的十大人性化设定和功能[转]
  • 原文地址:https://www.cnblogs.com/zhz-8919/p/10792649.html
Copyright © 2011-2022 走看看