关于Java中序列化Serializable的简单注解

2023-11-05

        最近学校的实训课程在学习ssm框架,其中有一点实体类里面实现了Serializable序列化的方法,查了一下,仍然有点模糊,序列化和数据库中的字段有关,方便数据存储和传输。
import java.io.Serializable;
public class Cost implements Serializable{ ......}
        今天,突然又有同学问我这个问题,什么是序列化,为什么要实现这个接口,打开这个接口一看,接口里面是空的。
        那么,为什么要序列化呢?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

序列化分为两种(正/反):

  1. 把对象转换为字节序列的过程称为对象的序列化
  2. 把字节序列恢复为对象的过程称为对象的反序列化

        前面讲到了,实际上,Serializable接口中什么都没有,是空的,他只是一个表示接口。就是告诉JVM,你来帮我做这个序列化,虚拟机自动进行序列化。
        在设置了序列化之后,类型那一行会给出一个异常,要求添加serialVersionUID,可以手动添加也可以自动添加。
        serialVersionUID的详细的工作机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化。
        简而言之,serialVersionUID是用来辅助对象的序列化与反序列化的。
        如有不完善的地方,欢迎指出。

参考资料:https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc

————————————————————————————————————————————————————

  • 在Java中,@Serializable注解用于标记一个类可以被序列化。被标记为@Serializable的类可以通过将其转换为字节流来保存到文件、数据库或通过网络传输。
import java.io.*;
import jakarta.annotation.Serializable;

@Serializable
public 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;
    }
  
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

        // 将Person对象序列化到文件
        try (FileOutputStream fos = new FileOutputStream("person.ser");
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(person);
            System.out.println("Person对象已成功序列化到文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件中反序列化Person对象
        try (FileInputStream fis = new FileInputStream("person.ser");
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            Person deserializedPerson = (Person) ois.readObject();
            System.out.println("从文件中反序列化得到的Person对象为:" + deserializedPerson.getName() + ", " +
                    deserializedPerson.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • 在上面的示例中,Person类被标记为@Serializable,表示该类可以被序列化。它具有name和age属性,以及相应的访问方法。在main方法中,我们创建了一个Person对象,将其序列化到文件person.ser中,然后从文件中反序列化该对象,并输出反序列化后的对象的属性值。

  • 请注意,@Serializable注解是Jakarta EE和Java SE中的一个标准注解,可以在这些环境中使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Java中序列化Serializable的简单注解 的相关文章

随机推荐

  • 总汇nexus 服务启动异常

    总汇nexus 服务启动异常 故障描述1 故障描述2 故障描述3 备份准备修复的数据库 故障描述1 nexus oss 3 一直运行得没什么问题 忽然发现运行特别慢然后到服务器去重启 莫名其妙一直启动失败 查看日志发现如下报错信息 2022
  • C51单片机晶振频率、时钟周期、状态周期、机器周期、指令周期和总线周期的关系

    一 晶振频率 1 英文全称 frequency oscillate 2 定义 晶体振荡器的固有频率 不能改变 3 如果外接12Mhz晶振 则晶振频率12Mhz 二 时钟周期 1 英文全称 Clock Cycle 为晶振频率12Mhz倒数 2
  • 面试题computed和watch的区别

    computed和watch的区别 1 英文翻译成中文 computed就是计算属性的意思 是用来计算出一个值的 这个值 我们在调用的时候 1 不需要加括号 2 根据依赖缓存 watch就是监听的意思 1 immediat表示是否第一次执行
  • Prometheus on k8s 部署与实战操作进阶篇

    文章目录 一 概述 二 常见的几款监控工具 1 kube prometheus 和 kube prometheus stack 区别 2 Prometheus Operator 和kube prometheus 或 kube prometh
  • openpose人体姿态估计

    参考博客 Openpose驾驶员危险驾驶检测 抽烟打电话 人体姿态识别模型 openpose OpenPose人体姿态识别项目是美国卡耐基梅隆大学 CMU 基于卷积神经网络和监督学习并以caffe为框架开发的开源库 可以实现人体动作 面部表
  • Spring MVC实例(增删改查)

    本文转载自 https www cnblogs com beast king p 5786752 html 作者 beast king 转载请注明该声明 数据库配置文件application context jdbc xml
  • 计算机视觉中自注意力构建块的PyTorch实现

    作者 AI Summer 编译 ronghuaiyang 导读 一个非常好用的git仓库 封装了非常全面的计算机视觉中的自注意力构建块 直接调用 无需重复造轮子了 git仓库地址 https github com The AI Summer
  • 深度学习(20)—— ConvNext 使用

    深度学习 20 ConvNext 使用 本篇主要使用convnext做分类任务 其中使用convnext tiny 其主要有5块 stage0 stage1 stage2 stage3 head 文章目录 深度学习 20 ConvNext
  • 小程序获取后台数据方法封装

    前言 实际再很早之前就有想再小程序里面做和vue中的axios封装的方法的操作 现在终于可以把自己的理解和整理封装整理下 目录 实现步骤 1 目录结构 总共两个文件 http js是对 wx request 和 wx uploadFile
  • 在云原生时代,构建高效的大数据存储与分析平台

    文章目录 1 选择适当的数据存储技术 2 采用分布式架构 3 数据分区和索引 4 采用列式存储 5 数据压缩和编码 6 使用缓存技术 7 数据分片和复制 8 自动化运维和监控 9 数据安全和权限控制 10 实时处理和流式分析 11 数据质量
  • 连接打印机出现0x0000007e错误的解决方法

    办公室用自己电脑连接公共服务器打印机时 出现出现0x0000007e错误 查找了微软论坛 解决方案如下 删除服务器电脑注册表中的copyfiles项 具体路径如下 registry gt Local Machine gt system gt
  • element组件库的el-select多选时候,选择三个时候下拉框抖动问题解决办法

    添加如下样式即可解决
  • 华为OD机试真题- 寻找链表的中间结点【2023Q1】【JAVA、Python、C++】

    题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点 则输出第二个中间结点保存的数据 例如 给定 L 为 1 7 5 则输出应该为 7 给定 L 为 1 2 3 4 则输出应该为 3 输入描述 每个输入包
  • php mysql layui分页_php+layui数据表格实现数据分页渲染代码

    一 HTML 二 JS 说明 需要引入layui中的table和laytpl模板引擎 laytpl可以自定义事件及自定义数据字段等 查看详情 if d hotcake 超级爆款 d hotcake else if d hotcake 大爆款
  • resultType和parameterType的基本使用和区别

    resultType与parameterType的基本使用和区别 Mybatis的Mapper文件中的select insert update delect元素中都有一个parameterType和resultType属性 paramete
  • MQ 入门实践

    MQ Message Queue 消息队列 FIFO 结构 例如电商平台 在用户支付订单后执行对应的操作 优点 异步 削峰 解耦 缺点 增加系统复杂性 数据一致性 可用性 JMS Java Message Service Java消息服务
  • ajax详细用法

    一 基础知识 1 首先让我们了解ajax 通过在后台与服务器进行少量数据交换 AJAX 可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 对网页的某部分进行更新 2 ajax的核心步骤 创建XMLHttpRequest对象
  • Android读取联系人的姓名及电话号码

    Android中联系人的信息是通过ContentProvider来供外部应用获取的 我们使用时只需根据系统联系人ContentProvider的Uri即可获取所需数据 下面讲解如何获取联系人的姓名及电话号码 别的数据如邮箱 照片等数据的获取
  • flutter开发中常用的dart插件

    本文罗列了一些在用flutter进行移动开发时经常会用到的插件 flutter插件官网地址 https pub dartlang org packages 1 image picker 一个可以从图库选择图片 并可以用相机拍摄新照片的flu
  • 关于Java中序列化Serializable的简单注解

    最近学校的实训课程在学习ssm框架 其中有一点实体类里面实现了Serializable序列化的方法 查了一下 仍然有点模糊 序列化和数据库中的字段有关 方便数据存储和传输 import java io Serializable public