码迷,mamicode.com
首页 > 编程语言 > 详细

java--序列化和反序列化

时间:2018-08-04 19:02:02      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:字段   sys   nal   赋值   str   uuid   system   自身   模式   

一、序列化

java序列化的过程是把对象转换为字节序列的过程

序列化的两种用途:

  1)把对象的字节序列永久保存大搜硬盘上,通常存放到一个文件中

  2)在网络上传送对象的字节序列

jdk中的序列化API:

java.io.ObjectOutputStream :表示对象输出流,他的writeObject(Object obj)方法可对参数制定的ibj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream  :表示对象输入流,他的readObject()方法从一个源输入流中读取字节序列,再把他们反序列化为一个对象,并将其返回。

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而实现了Serializable接口的类可以采用默认的序列化方式。

二、对象序列化的步骤:

  1、创建一个对象输出流,它可以包装一个其他类型的源输入流,如文件输入流(IO流 装饰者模式)

  2、通过对象输出流的writeObject()方法写对象

对象反序列化额步骤:

  1、新创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流

  2、通过对象输入流的readObject()方法读取对象

 

代码示例:

Person.java  

public class Person implements Serializable {

    private int age;
    private String name;
    private String sex;

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name=‘" + name + ‘\‘‘ +
                ", sex=‘" + sex + ‘\‘‘ +
                ‘}‘;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Person(int age, String name, String sex) {
        this.age = age;
        this.name = name;
        this.sex = sex;
    }
}

序列化和反序列化person对象  序列化后的Person.txt文件中乱码 因为序列化的过程是将对象变成二进制存储的

public static void SerializePerson() throws IOException {
        Person person=new Person(15,"xiaoming","nan");
        //ObjectOutputStream 对象输出流,将Person对象存储到Person.txt文件,完成对Person对象的序列化
        ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream(new File("classpath:Person.txt")));
        oo.writeObject(person);
        System.out.println("serialize complete");
        oo.close();
    }

反序列化的过程:

public static void Deserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("classpath:Person.txt"));
        Person person = (Person) ois.readObject();
        System.out.println(person.toString());
        System.out.println("deserialize complete");
        ois.close();
    }

运行两个过程:

serialize complete
Person{age=15, name=‘xiaoming‘, sex=‘nan‘}
deserialize complete

忽然想起了transient关键字:做了个小改动

为Person类添加一个transient修饰的ext字段 创建person对象时为ext赋值 进行序列化,并且反序列化

public class Person implements Serializable {
    private int age;
    private String name;
    private String sex;
    private transient String ext;

序列化的person.txt文件中没有ext 反序列化的person对象的ext为null

serialize complete
Person{age=15, name=‘xiaoming‘, sex=‘nan‘, ext=‘null‘}
deserialize complete

 

三、serialVersionUUID的作用

serialVersionUUID:序列化版本号,凡是实现Serializable接口的类都有一个表示序列化版本表示的静态变量(没有自动生成 也没有警告)

将Person序列化后再为Person类添加一个属性,再进行反序列化 反序列化失败

 

java--序列化和反序列化

标签:字段   sys   nal   赋值   str   uuid   system   自身   模式   

原文地址:https://www.cnblogs.com/zhy-study/p/9419214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!