Java 序列化与反序列化

简介: Java 序列化与反序列化

一、说明


序列化与反序列化是什么


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



目录
相关文章
|
4天前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
13天前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
41 10
|
6天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
13天前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
21天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
3天前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
11 0
|
9天前
|
XML Dubbo Java
分布式-序列化,反序列化
分布式-序列化,反序列化
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
17 0
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
下一篇
无影云桌面