Java 序列化与反序列化

举报
Yeats_Liao 发表于 2022/10/20 21:44:43 2022/10/20
【摘要】 一、说明序列化与反序列化是什么序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输反序列化:从文件中读取序列化对象,对它进行反序列化,恢复成Java对象 二、理解序列化过程整个过程是JVM独立的,序列化的对象可以在不同的平台上反序列化该对象对象序列化,类必须实现Serializable接口该类的所有属性必须是可序列化的,如果有一个属性不是可序列化的,则该属性必须注...

一、说明

序列化与反序列化是什么

  • 序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输

  • 反序列化:从文件中读取序列化对象,对它进行反序列化,恢复成Java对象

二、理解

序列化过程

  • 整个过程是JVM独立的,序列化的对象可以在不同的平台上反序列化该对象
  • 对象序列化,类必须实现Serializable接口
  • 该类的所有属性必须是可序列化的,如果有一个属性不是可序列化的,则该属性必须注明是短暂的
  • 使用IO流中的对象流实现序列化操作,将对象保存到文件,再读取出来
  • 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名

序列化作用

  • 对象转化为二进制,可用于网络传输
  • 把内存中的对象保存到一个文件中或者数据库中

三、实现

1.实现接口

创建一个Student类,实现Serializable接口

public  class Student implements java.io.Serializable {
    public String name;
    public String classes;
    public transient int SSN;
    public int number;
    public void checkInfo() {
        System.out.println("Student Info " + name
                + " " + classes);
    }
}

2.序列化方法

ObjectOutputStream.writeObject()方法

			FileOutputStream fileOut = new FileOutputStream("file\\student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(s);
            out.close();
            fileOut.close();
public class SerializeDemo {
    public static void main(String [] args){
        Student s = new Student();
        s.number = 17;
        s.name = "Good";
        s.classes = "computer_1";
        s.SSN = 233;
        try {
            FileOutputStream fileOut =
                    new FileOutputStream("file\\student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(s);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in file/student.ser");
        }catch(IOException i) {
            i.printStackTrace();
        }
    }
}

在这里插入图片描述

3.反序列化方法

ObjectInputStream.readObject()方法

            FileInputStream fileIn = new FileInputStream("file\\student.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            s= (Student) in.readObject();
            in.close();
            fileIn.close();
public class DeserializeDemo {
    public static void main(String [] args) {
        Student s = null;
        try {
            FileInputStream fileIn = new FileInputStream("file\\student.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            s= (Student) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i) {
            i.printStackTrace();
            return;
        }catch(ClassNotFoundException c) {
            System.out.println("Student class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Student");
        System.out.println("Name: " + s.name);
        System.out.println("Address: " + s.classes);
        //SSN属性是短暂的,该值没有被发送到输出流,反序列化后属性为 0
        System.out.println("SSN: " + s.SSN);
        System.out.println("Number: " + s.number);
    }
}

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。