Java序列化最全详解(图文全面总结)

createh53个月前 (01-24)技术教程59

序列化是网络通信的核心,也是分布式系统通信的关键实现,下面我就重点详解Java序列化@mikechen

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

Java序列化

序列化是将对象转换为字节序列的过程,以便将其保存在文件中、通过网络传输。

Java序列化是序列化的一种实现,用于将对象转化为字节流,以便将其存储在文件中、通过网络传输或在不同的Java虚拟机之间进行共享。

Java序列化的主要作用,如下:

  1. 数据持久化:将对象序列化为字节流,然后保存在文件或数据库中,以便在应用程序重新启动时重新加载和使用。
  2. 分布式应用:在分布式系统中,可以使用Java序列化来传输对象,使不同计算节点之间能够共享数据。
  3. 远程通信:Java序列化可用于在网络上传输对象,允许客户端和服务器之间进行通信。
  4. 缓存:对象可以序列化后存储在内存中,以加快对对象的访问速度。

Java序列化实现

要实现Java序列化,需要执行以下步骤:

1.实现Serializable接口

首先,确保要序列化的类实现了java.io.Serializable接口。

如下所示:

import java.io.Serializable;

public class MyClass implements Serializable {
    // 类的字段和方法
}

这是一个标记接口,不包含任何需要实现的方法,它只是告诉Java编译器和运行时系统,该类可以被序列化。

2.实现序列化的类

实现序列化的类,可以使用ObjectOutputStream来将对象序列化为字节流。

如下所示:

try {
    MyClass objectToSerialize = new MyClass();
    FileOutputStream fileOut = new FileOutputStream("object.ser"); // 创建输出流
    ObjectOutputStream out = new ObjectOutputStream(fileOut); // 创建ObjectOutputStream
    out.writeObject(objectToSerialize); // 序列化对象
    out.close(); // 关闭流
    fileOut.close();
} catch (IOException e) {
    e.printStackTrace();
}

3.版本控制

为了避免版本不匹配的问题,可以在序列化类中使用serialVersionUID字段。

如下所示:

private static final long serialVersionUID = 1L;

这个字段是一个唯一标识符,当类结构发生变化时,可以使用它来确保反序列化仍然成功。

java序列化示例

Java序列化完整使用示例,如下所示:

import java.io.*;

// 自定义类,实现Serializable接口
class Person implements Serializable {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个Person对象
        Person person = new Person("Alice", 30);

        // 序列化对象到文件
        try {
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(person);
            out.close();
            fileOut.close();
            System.out.println("Person object serialized to person.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化对象
        try {
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Person deserializedPerson = (Person) in.readObject();
            in.close();
            fileIn.close();

            // 打印反序列化后的对象信息
            System.out.println("Deserialized Person - Name: " + deserializedPerson.getName() + ", Age: " + deserializedPerson.getAge());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们首先创建一个Person对象,然后使用ObjectOutputStream将其序列化为名为"person.ser"的文件。

接着,我们使用ObjectInputStream从文件中读取字节流并将其反序列化为Person对象,最后输出反序列化后的对象信息。

java序列化总结

总之,Java序列化是一种强大的机制,用于在Java应用程序之间进行对象的持久化和通信。

但在使用时,需要谨慎处理版本控制、安全性和性能问题,以确保数据的完整性和安全性。

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

相关文章

Java基础之Java标识符有哪些?命名规范是什么?

“这里是云端源想IT,帮你轻松学IT”嗨~ 今天的你过得还好吗?落日余晖的路上总是爱意弥漫别让世俗淹没生活的浪漫和热情- 2023.08.02-Java语言中,对于变量,常量,函数,语句块也有名字,我...

Java初学者需要了解的10个语法细节

语法语法,语法就是语言的法则。汉语有汉语的语法,英语有英语的语法,如果不懂语法那你写出来的句子要不然就是错误,要不然就是生涩难懂。要学习和使用Java语言就要遵守Java语言的规则,要不然你的程序就不...

初学Java者需要了解什么 Java基础知识有哪些

  初学Java者需要了解什么?Java基础知识有哪些?学习Java的发展前景广阔且发展方向多样性,不仅可以成为高级技术开发人才,还可以向管理岗发展,成为项目经理。通过分析企业对求职者的招聘技能,我们...

理解Java中的哈希码的概念和重要性

介绍Java 是一种功能全面且强大的编程语言,为开发人员提供了构建复杂应用程序的便捷途径。哈希码在 Java 以及众多其他编程语言中占据着核心概念的地位。对于致力于深入探索 Java 编程的人来说,了...

Java社招面试题:Map的Key你真的了解吗?

#头条开新年#大家好,我是积极分享技术的小米!今天给大家带来一道经典的Java社招面试题:“能否使用任何类作为Map的Key?为什么HashMap中String、Integer这样的包装类适合作为K...

Java错误排行:50种常见bug及如何避免它们(一)

开发Java软件时会遇到很多类型的错误,但是大多数错误是可以避免的。编写代码时,有些错误是次要的失误,但这是很容易纠正的。如果您具有诸如Stackify Retrace之类的错误监视工具,则可以轻松编...