首页 > 编程语言 >Java 序列化与反序列化

Java 序列化与反序列化

时间:2022-11-13 23:01:00浏览次数:36  
标签:Java System Student new 序列化 public out

(目录)

一、说明

序列化与反序列化是什么

  • 序列化:将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);
    }
}

在这里插入图片描述

标签:Java,System,Student,new,序列化,public,out
From: https://blog.51cto.com/yeatsliao/5847996

相关文章

  • Javascript的预解析
    浏览器不是直接运行JS的,是调用js引擎运行js.js引擎运行js分为两个步骤:1.预解析:js引擎会把js里面所有的var,以及所有的function提升到当前作用域的最前面2.代码执行......
  • Head First Java 读书笔记 15章
    第15章:网络与线程(网络联机)在Java中,所有网络运作的低层细节都已经由java.net函数库处理。Java中,传送和接收网络上的数据,是在链接上使用不同链接串流的输入和输出。什么......
  • Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
    一、标准CRUD使用对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢?我们先来看张图:1.1环境准备这里用的环境就是Java开发学习(四十)----MyBat......
  • java
    可变参数在方法声明中,在指定参数类型后加一个省略号(...)一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须唉它之前声明    ......
  • 【Java】回顾一下Java中的synchronized
    synchronized在JDK1.5之前是一个重量级锁,相当于JUC里面的lock锁,但是在1.6版本及之后对它做了很大的升级和优化,它不在那么的笨重了。synchronized的作用主要有三个:原子性:确......
  • Java的五大引用
    目录五大引用概述强引用软引用演示弱引用演示虚引用终结器引用五大引用概述基于可达性算法的垃圾回收实线是强引用,虚线是其他引用强引用只有所有GCRoots对象......
  • java——继承与多态——重点部分总结**********************************************
    Java类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分  成员变量名:成员变量名只要是一个合法的标识符......
  • Java索引
    Java运算符Java基础数据类型Java数组Java数组工具类--ArraysJava比较器--Compare/ComparableJava集合Java函数编程Java泛型编程......
  • pailler算法加密后如何进行密文计算-java
    1.背景工作中需要用到密文计算,涉及密文求和sum、平均avg以及加权平均wavg。特此分享,供参考。2.代码2.1分数类MyFraction涉及小数运算,但是密文目前只能存整数,所以考......
  • 【博学谷学习记录】超强总结,用心分享 。java基础知识。
    Java基础知识1.面向对象的特征封装:就是把对象的属性和行为结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西......