java中ObjectOutputStream和ObjectInputStream的使用

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

/**
 * 序列化对象。
 * 把对象持久化到存储设备上
 * ObjectOutputStream 将java对象的基本数据类型和图形写入OutputStream。
 * ObjectOutputStream 这个类专门把创建的对象持久化到网络或者持久化设备上。
 * 当我们要把一个对象持久化到外围设备上,或者网络上的时候,这个对象所属的类必须实现java.io.Serializable接口。
 *
 * 在对象的序列化中,可能因为以下问题发生异常:
 * 1.当我们去读取已经被序列化的对象时,如果当初在这个对象序列化的时候是通过无参数的构造方法创建的对象,而后来对这个类进行修改,导致这个类没有无参数的构造方法时,就发发生异常。
 *
 * 2.该类包含未知数据类型。
 *
 * 3.因为序列化时,使用一个称为serialVersionUID的版本号,与每个可序列化的类相关联。在序列化,反序列化过程中会验证这个版本号是否相同。
 * 每个类的serialVersionUID是唯一的。注意:在开发的时候,当一个对象需要被序列化的时候,这个对象所属的类一定要实现Serializable接口,并且最好自己指定这个版本号的值。
 *
 * 类中的静态变量不会被序列化。!!
 *
 * 注意:当我们在序列化对象,如果对象中的某些变量不需要序列化,那么只需要将这个对象的变量用transient修饰这个变量。这个在序列化的同时,它就不会被序列化,我们称这个关键字为瞬态关键字。
 *
 * @author print
 *
 */
public class Demo1 {

    public static void main(String[] args) {
        wirteObj();
        readObj();
    }

    public static void readObj() {
        try {
            InputStream in = new FileInputStream("d:\\p.info");
            ObjectInputStream ois = new ObjectInputStream(in);
            Object readObject = ois.readObject();
            System.out.println(readObject);
            ois.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
    }

    public static void wirteObj() {
        try {
            OutputStream os = new FileOutputStream("d:\\p.info");
            ObjectOutputStream oos = new ObjectOutputStream(os);
            //创建需要被持久化的对象
            Person p = new Person("zy", "22","nv");
    
            //把对象持久化到硬盘上
            oos.writeObject(p);
            oos.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

Person类:

import java.io.Serializable;


public class Person implements Serializable{

    private String name;
    private String age;
    private transient String sex;
    
    
    public Person() {
        super();
    }
    
    
    public Person(String name, String age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }


    public String toString() {
        return "Person [name=" + name + ", age=" + age +",sex=" +sex+"]";
    }
    
    
}





猜你喜欢

转载自blog.csdn.net/zhangying1994/article/details/51056210