序列化与反序列化

序列化流和反序列化流 ObjectInputStream和ObjectOutputStream
概述
Java是面向对象语言,万事万物皆对象,如果我们想要将对象持久化写入到本地或者在网络中传输,我们可以使用序列化流和反序列化流

特点
字节流读写文件的功能
能够读写引用数据类型,即读写对象
需要写入到文件的对象需要该对象的类实现Serializable,否则会抛出异常
如果不希望对象的某个成员写入到文件,保障成员的安全性,可以使用transient关键字修饰。

serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID,JVM将根据您的Serializable类的各个方面自动为您执行此操作。
自定义声明序列id语句 :
private static final long serialVersionUID
在需要序列化的类名后实现implements Serializable,在类体里声明serialVersionUID。当反序列化时再次在反序列化类体声明,两者数字需要相同,不然会出现异常java.io.InvalidClassException。

当你不声明 serialVersionUID时,系统会根据你需要序列化的类对象自动生成一个 serialVersionUID保存,再将对象写入文件中。当你反序列化的时侯,再次根据文件的对象生成的 serialVersionUID,与写入时的 serialVersionUID对比,如更改过对象信息,不进行反序列化。
序列化后生成的Class文件(类名,方法命等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID也不会变化的。

public class Person implements Serializable {
private static final long serialVersionUID=4359709211352400087L;
     public int id;
    transient  public String name;
    transient   public final String userName;
    public int age;

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
       this.userName="aaaaa";
       this.age=age;
    }

}

public class SerialTest {
    //private static final long serialVersionUID=4359709211352400087L; //不需要写serialVersionUID
    public static void main(String[] args) {
        Person p=new Person(1124,"张三",18);
        System.out.println(p);
        try {
        FileOutputStream fos=new  FileOutputStream("xxx\\person.txt");
            final ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(p);
            oos.useProtocolVersion(98765);
            oos.flush();
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class DeserialTest {
    private static final long serialVersionUID=4359709211352400087L;
    public static void main(String[] args) {

        Person p;
        try {
            FileInputStream fis=new FileInputStream("xxx\\person.txt");
            ObjectInputStream ois=new ObjectInputStream(fis);
           p = (Person)ois.readObject();
           ois.close();
            System.out.println(p.userName);
            System.out.println(p.id);
            System.out.println(p.name);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值