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

Java的序列化与反序列化代码实现(ObjectOutputStream、ObjectInputStream)

时间:2021-06-03 18:28:27      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tin   private   file   序列化   dea   rri   磁盘   http   err   

序列化和反序列化

序列化

对象序列化,就是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息。字节序列写到文件之后,相当于文件中保存了一个对象的信息。

反序列化

将该字节序列从文件中读取回来,重构对象

Java序列化和反序列化时需要的两个类

  • 对象序列化流:ObjectOutputStream
  • 对象反序列化流:ObjectInputStream

一个接口——Serializable

在我们进行对象序列化的时候,需要该对象实现一个接口:Serializable,一个对象要想被序列化,该对象所属的类必须实现Serializable接口;Serializable是一个标记接口,实现该接口,不需要重写任何方法,在JDK9的文档中这样描述:类的序列化由实现java.io.Serializable接口的类启用,不实现此接口的类将不会使任何状态序列化或反序列化

代码实现

学生类——Student

该类实现了Serializable接口,同时由于该接口是一个标记接口,因此在实现该类时不需要重写任何方法

import java.io.Serializable;

/*
 1、类的序列化由实现java.io.Serializable接口的类启用,不实现此接口的类将不会使任何状态序列化或反序列化
 2、一个对象要想被序列化,该对象所属的类必须实现Serializable接口
 3、Serializable是一个标记接口,实现该接口,不需要重写任何方法
*/

public class Student implements Serializable {
    private String name;
    private int age;

    public Student() {
    }

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

    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 "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}

对象序列化类——ObjectOutputStreamDemo

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        //  ObjectOutputStream?(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("idea_demo\\serialize.txt"));

        // 创建需要被序列化的Student对象
        Student s = new Student("shley",22);

        //  writeObject?(Object obj):将指定的对象写入ObjectOutputStream
        oos.writeObject(s);

        // 释放资源
        oos.close();
    }
}

运行该程序,在idea_demo目录下生成对象序列化后的文件:serialize.txt

技术图片

对象反序列化类——ObjectInputStreamDemo

public class ObjectInputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // ObjectInputStream?(InputStream in):创建从指定的InputStream读取的ObjectInputStream。
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("idea_demo\\serialize.txt"));

        //  readObject?():从ObjectInputStream读取一个对象
        Object o = ois.readObject();

        // 转成Student对象
        Student s = (Student)o;

        // 输出Student对象(注意,在Student类中我们重写了toString方法)
        System.out.println(s);

        // 释放资源
        ois.close();
    }
}

反序列化idea_demo目录下的文件serialize.txt得到控制台输出:

技术图片

Java的序列化与反序列化代码实现(ObjectOutputStream、ObjectInputStream)

标签:tin   private   file   序列化   dea   rri   磁盘   http   err   

原文地址:https://www.cnblogs.com/shley/p/14845586.html

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