首页 > 编程语言 >Java中的序列化与反序列化深度剖析

Java中的序列化与反序列化深度剖析

时间:2024-08-27 10:25:49浏览次数:10  
标签:Java name age 剖析 Person 序列化 String

序列化与反序列化在Java开发中扮演了重要角色,特别是在数据持久化、RPC(远程过程调用)以及分布式系统中。本篇博客将详细解析Java中的序列化机制,讨论常见的序列化框架,并提供实际代码示例帮助理解。

什么是序列化与反序列化?

  • 序列化(Serialization):将Java对象转换为字节流的过程,以便将其写入文件、发送到网络等。
  • 反序列化(Deserialization):将字节流转换回Java对象的过程,以便在内存中重建对象。

Java原生序列化机制

Java提供了一种内置的序列化机制,通过java.io.Serializable接口实现。只需让类实现Serializable接口,就可以序列化和反序列化对象。

示例代码
import java.io.*;

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class SerializationDemo {

    public static void main(String[] args) {
        Person person = new Person("John Doe", 30);

        // 序列化
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
            System.out.println("Serialization successful: " + person);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) ois.readObject();
            System.out.println("Deserialization successful: " + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

原生序列化的优缺点

优点缺点
简单易用,Java原生支持序列化后的数据量较大
不需要额外的库性能较低
可处理循环引用和复杂对象图不便于跨语言
内置了版本控制机制版本升级时容易出问题

序列化框架对比

除了Java原生序列化,常见的序列化框架还有Jackson、Gson、Protobuf等。它们各有优缺点,适用于不同的场景。

Jackson

Jackson是一个强大的数据处理库,支持JSON序列化和反序列化。

示例代码
import com.fasterxml.jackson.databind.ObjectMapper;

class Person {
    private String name;
    private int age;

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

    // getters and setters omitted for brevity
}

public class JacksonDemo {
    public static void main(String[] args) {
        try {
            Person person = new Person("Jane Doe", 25);
            ObjectMapper mapper = new ObjectMapper();

            // 序列化
            String json = mapper.writeValueAsString(person);
            System.out.println("Serialization successful: " + json);

            // 反序列化
            Person deserializedPerson = mapper.readValue(json, Person.class);
            System.out.println("Deserialization successful: " + deserializedPerson);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Gson

Gson是Google提供的用于处理JSON的库,功能简单易用。

示例代码
import com.google.gson.Gson;

class Person {
    private String name;
    private int age;

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

    // getters and setters omitted for brevity
}

public class GsonDemo {
    public static void main(String[] args) {
        try {
            Person person = new Person("Alice", 28);
            Gson gson = new Gson();

            // 序列化
            String json = gson.toJson(person);
            System.out.println("Serialization successful: " + json);

            // 反序列化
            Person deserializedPerson = gson.fromJson(json, Person.class);
            System.out.println("Deserialization successful: " + deserializedPerson);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Protobuf

Protobuf是Google开发的一种高效的序列化框架,适用于高性能需求的场景。

示例代码

首先需要定义一个.proto文件:

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
}

使用protoc编译生成Java类,然后可以使用以下代码进行序列化和反序列化:

import com.example.PersonOuterClass.Person;

public class ProtobufDemo {
    public static void main(String[] args) {
        try {
            Person person = Person.newBuilder().setName("Bob").setAge(32).build();

            // 序列化
            byte[] serializedData = person.toByteArray();
            System.out.println("Serialization successful");

            // 反序列化
            Person deserializedPerson = Person.parseFrom(serializedData);
            System.out.println("Deserialization successful: " + deserializedPerson);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

序列化框架对比

特性Java原生序列化JacksonGsonProtobuf
数据格式二进制JSONJSON二进制
性能较低中等中等
易用性简单较复杂简单较复杂
数据量中等中等
跨语言支持不便于良好良好优秀
特性内置版本控制丰富的功能简单易用高效,适用于高性能场景

实际应用场景及选择建议

数据持久化

对于需要将对象持久化存储的场景(例如保存到数据库或文件系统),JSON格式(如Jackson或Gson)通常是一个好选择,因为它易于阅读和调试。

网络通信

在网络通信中,特别是跨语言和性能要求高的场景下,Protobuf因其高效的二进制格式和跨语言支持是一个理想选择。

内部数据传输

在一些内部系统之间的数据传输场景中,Java原生序列化可能是一个快速实现的选择,尤其是在数据格式与系统语言一致的情况下。

总结

序列化与反序列化是Java开发中的重要技术,了解不同序列化框架的特点及其适用场景,可以帮助我们做出更明智的技术选择。希望这篇博客能帮助你深入理解Java中的序列化机制,并在实际项目中灵活应用。

标签:Java,name,age,剖析,Person,序列化,String
From: https://blog.csdn.net/weixin_53840353/article/details/141561541

相关文章

  • java+vue计算机毕设线上图书商城系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为现代商业活动的重要组成部分,深刻改变着人们的消费习惯。在数字化阅读日益普及的今天,线上图书商城系统应运而......
  • java+vue计算机毕设社区团购平台【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和智能设备的普及,电子商务行业正经历着前所未有的变革。社区团购平台作为新零售模式的一种重要形式,近年来迅速崛起并受到广......
  • java+vue计算机毕设四川工商学院疫情防控系统的设计与实现【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球疫情的持续演变,高校作为人员密集、流动性大的场所,其疫情防控工作显得尤为重要。四川工商学院作为一所培养未来社会栋梁的高等学府,面对疫情挑......
  • JavaScript 的事件循环、宏任务、微任务
    JavaScrtipt执行顺序首先,必须要明确,在JavaScript中,所有任务都在主线程上执行。任务执行过程分为同步任务和异步任务两个阶段。异步任务的处理经历两个主要阶段:EventTable(事件表)和EventQueue(事件队列)。EventTable存储了宏任务的相关信息,包括事件监听和相应的回调函数。当特定......
  • Java中方法重写的学习
    方法重写目录方法重写方法重写的规则方法重载的规则方法重写的规则在Java中,方法重写(Overriding)是面向对象编程中的一个核心概念,它允许子类提供一个与父类相同名称、相同参数列表的方法,以实现或修改父类方法的行为。方法重写必须遵循一定的规则,以确保程序的正确性和可维护性。......
  • 滚雪球学Java(91):Java GUI编程实战:精通组件开发技巧,真有点东西!
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及JavaSE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~......
  • JVM(Java Virtual Machine,Java虚拟机)
    JVM(JavaVirtualMachine,Java虚拟机)是Java平台的核心组成部分,它负责运行Java程序。JVM使得Java程序能够“一次编写,到处运行”(WriteOnce,RunAnywhere),这是Java语言的一个重要特性。JVM通过在不同的操作系统上提供统一的运行时环境来实现这一特性。JVM的主要组成部分JVM主......
  • java反序列化——CC1链
    参考【【Java反序列化链】CommonsCollections1深入浅出,详细分析(cc1链)】【Java反序列化链】CommonsCollections1深入浅出,详细分析(cc1链)_哔哩哔哩_bilibilijava反序列化是java安全中非常重要的一点,也是最难的一点,我只能勉强跟着链子走一遍附上一些浅显的理解。 CC1链也......
  • Java线程的实践及原理揭秘
    Java线程的实践及原理揭秘并发是什么?系统支持高并发的因素是哪些?1.如何理解系统的并发一般来说,系统在单位时间内能够承载的并发数就是整个系统同事能够处理的请求数量。对于并发的指标通常通过TPS/QPS来表示QPS:每秒处理的查询数(Queries-Per-Second)TPS:每秒处理的事务数(Tr......
  • 【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......