• 序列化流与反序列化流


    原理图:

    序列化流

     ObjectOutputStream Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储

        注意:只能将支持 java.io.Serializable 接口的对象写入流中

     ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。支持 java.io.Serializable接口的对象才能从流读取

    特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象

    序列化接口

      注意:当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常

         同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下

         1.该类的序列版本号与从流中读取的类描述符的版本号不匹配

         2.该类包含未知数据类型

         3.该类没有可访问的无参数构造方法

    Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配

    不被序列化的情况

      1.被transient修饰了,序列化时这个属性就不会序列化了

      2.静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化

    例子:

    person类:

    package com.oracle.demo01;
    
    import java.io.Serializable;
    
    public class Person implements Serializable{
    	private String name;
    	//瞬态关键字transient 修饰后不会被序列化
    	//private transient int age;
    	//静态修饰的成员变量属于类,不属于木个对象,序列化只能序列化属于对象的属性
    	private static int age;
    	public static final long serialVersionUID=1L;
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	public Person() {
    		super();
    	}
    	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;
    	}
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + "]";
    	}
    	
    }
    

      序列化

    package com.oracle.demo01;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    
    public class Demo01 {
    
    	public static void main(String[] args) throws IOException {
    		//明确目的的
    		FileOutputStream fos=new FileOutputStream("D:\demo1018\person.txt");
    		//创建序列化流
    		ObjectOutputStream oos=new ObjectOutputStream(fos);
    		//创建对象
    		Person p=new Person("张三",18);
    		//写一个对象
    		oos.writeObject(p);
    		//释放资源
    		oos.close();
    	}
    
    }
    

      反序列化

    package com.oracle.demo01;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    
    public class Demo02 {
    
    	public static void main(String[] args) throws IOException, ClassNotFoundException {
    		//明确数据源
    		FileInputStream fis=new FileInputStream("D:\demo1018\person.txt");
    		//创建反序列化流
    		ObjectInputStream ois=new ObjectInputStream(fis);
    		//反序列化得到对象
    		Object o=ois.readObject();
    		System.out.println(o);
    		//释放资源
    		ois.close();
    	}
    
    }
    

      

  • 相关阅读:
    11.06第十次作业
    (构造方法私有化、this)10.29练习题
    10.23创造人
    10.16(RuPeng)游戏
    10.09
    作业9.25
    练习题
    (随机数之和)求一整数各位数之和1636050052王智霞
    两点之间的距离1636050052王智霞
    TabLayout 简单使用。
  • 原文地址:https://www.cnblogs.com/zqy6666/p/12307472.html
Copyright © 2020-2023  润新知