zoukankan      html  css  js  c++  java
  • 对象输入输出流ObjectInputStream、ObjectOutputStream(对象的序列化与反序列化)

    如题
    • 所有关联的类需要继承Serializable 接口
    • 文件为空,直接反序列化为发生错误; 毕竟对象为null , 序列化到文件里不是空空的!
    • 以下笔记的原文连接: https://www.cnblogs.com/fnz0/p/5410856.html
    1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
    2. 对象的反序列化创建对象的时候并不会调用到构造方法的、(这点文中没有说到,想要验证的同学在构造方法后面加一句System.out.println("构造方法执行吗?");,实际上构造方法是不执行的,自然这句话也没有输出了)
    3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
    4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID
      进行对比,如果这两个id不一致,反序列则失败。
    5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后
      在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。
    6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
    7. 如果一个类维护了另外一个类的引用,则另外一个类也需要实现Serializable接口。
    代码
    /**
     * 对象输出流 
     * @author Administrator
     *
     */
    // 必须实现Serializable接口
    public class Person implements Serializable {
        //  private static final long serialVersionUID = 1L;
    	private String name;
    	private Dog dog;
    	private List<Book> books;
    	// 省略getter / setter / toString() ....
    	
    /**
    	 * main测试类
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		//对象输出流,序列化到当前path目录
    		String path="src/com/szs/serialize/person-data.txt";
    		try {
    			Person person = new Person();
    			person.setDog(new Dog("阿发","12"));
    			List<Book> books = new ArrayList<Book>();
    			books.add(new Book("Java", 200, "清社"));
    			books.add(new Book("C#", 300, "机械"));
    			person.setBooks(books);
    			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
    			
    			out.writeObject(person);
    		//在从当前目录读取, 输出到控制台; 		
    			//对象输入流,反序列化到控制台
    			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
    			Person person2 = (Person) ois.readObject();
    			System.out.println(person2);
    			
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    	
    }
    

    两个Person里的属性里的对象

    class Dog implements Serializable {
    	private String name;
    	private String age;
    	public Dog(String name,String age) {
    		this.name=name;
    		this.age=age;
    	}
    	// 省略getter / setter / toString() ....
    }
    
    class Book implements Serializable  {
    	private String name;
    	private Integer price;
    	private String author;
    	
    	public Book(String name, Integer price, String author) {
    		super();
    		this.name = name;
    		this.price = price;
    		this.author = author;
    	}
    	/// 省略getter / setter / toString() ....
    }
    
    测试结果

    文件里 (乱码了)

    � sr com.szs.serialize.Person*e犵韽 L bookst Ljava/util/List;L dogt Lcom/szs/serialize/Dog;L namet Ljava/lang/String;xpsr java.util.ArrayListx佉櫱a?
     I sizexp   w   sr com.szs.serialize.Book榾7?? L authorq ~ L nameq ~ L pricet Ljava/lang/Integer;xpt 娓呯ぞt Javasr java.lang.Integer鉅�亣8 I
     valuexr java.lang.Number啲?斷?  xp   萻q ~ t 鏈烘�t C#sq ~   ,xsr 
    com.szs.serialize.Dogn磻;y冴 L ageq ~ L nameq ~ xpt 12t 闃垮彂p
    

    控制台

    Person [name=null, dog=Dog [name=阿发, age=12], 
        books=[Book [name=Java, price=200, author=清社], Book [name=C#, price=300, author=机械]]]
    
  • 相关阅读:
    浓缩版java8新特性
    restful的认识和用法
    常用业务返回对象类ResponseJson
    微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
    完整且易读的最新版小程序登录态和检验注册过没的app.js写法
    完整且易读的微信小程序的注册页面(包含倒计时验证码、获取用户信息)
    BCD工具类(8421)
    IDEA下使用protobuf2(java)
    chrome 调试技巧
    encodeURI和encodeURIComponent的区别?
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/11052720.html
Copyright © 2011-2022 走看看