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

Java序列化

时间:2023-06-17 12:23:16浏览次数:39  
标签:java 字节 对象 io new Java 序列化

一、序列化和反序列化

序列化:将数据结构或对象转换成二进制字节流的过程

反序列化:将在序列化过程中产生的二进制字节流转换成数据结构或对象的过程

 

常见场景:

1、网络传输时,对象需要先被序列化,接收到后再进行反序列化

2、将对象持久化到磁盘、文件时需要先进行序列化,从磁盘或者文件读取对象时需要进行反序列化

3、将对象存储到数据库如redis之前需要用到序列化,将对象从数据库中读取出来需要反序列化

4、将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化

5、实现对象的深拷贝

 

序列化属于 TCP/IP 协议的应用层,OSI 七层协议模型中的表示层。

 

二、实现序列化的方法

实现java.io.Serializable接口即可。对于不想进行序列化的变量,可以使用 transient 关键字修饰。

使用序列化和反序列化实现深拷贝的代码如下:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class DeepCopyUtil {
    public static <T> T deepCopy(T obj) throws Exception {
        // 创建字节输出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        // 将对象写入字节输出流中
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();

        // 从字节数组中读取对象
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        T newObj = (T) ois.readObject();
        ois.close();

        return newObj;
    }
}

  

具体步骤如下:

  1. 将要拷贝的对象进行序列化,得到一个字节流。

  2. 将字节流反序列化成一个新的对象,即完成了对象的拷贝。

 

标签:java,字节,对象,io,new,Java,序列化
From: https://www.cnblogs.com/coooookie/p/17487326.html

相关文章

  • Java线程池与异常处理
    线程池线程池的创建代码ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,......
  • Java值传递
    一、形参&实参实参:实际传递给方法的参数形参:用于定义方法,接收实参,不需要有确定的值 二、值传递&引用传递值传递:方法接受的是实参值的拷贝,会创建副本引用传递:方法接收的是实参所引用对象在堆中的地址,不会创建副本,对形参的修改将影响到形参Java只有值传递  publicstati......
  • JAVA集合
    一、集合框架概览Java集合也叫做容器,由两大接口派生而来,一个是collection接口,主要用于存放单一元素,另一个是map接口,用于存放键值对。collection有三个子接口:list、set、queue。相较于数组,Java集合的优势在于它们的大小可变、支持泛型、具有内建算法,比如add(),remove()等。 l......
  • java——微服务——spring cloud——Nacos——Nacos配置共享
       ......
  • java——微服务——spring cloud——Nacos——Nacos配置热更新
                                                          ......
  • Java 命名规范
    包命名规范包(Package)的作用是将功能相似或相关的类或者接口进行分组管理,便于类的定位和查找,同时也可以使用包来避免类名的冲突和访问控制,使代码更容易维护。通常,包名使用小写英文字母进行命名,并使用“.”进行分割,每个被分割的单元只能包含一个名词。一般地,包命名常采用顶级域......
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实
    异常传播有时候,您可能需要重新抛出捕获到的异常。这种情况通常发生在捕获到Error或RuntimeException时,因为您可能没有预料到这些异常,但在声明捕获Throwable和Exception时,它们也被包含在内了。为了解决这个问题,Guava提供了多种方法来判断异常类型并重新抛出异常。例如:try{......
  • JavaScript & TypeScript 学习总结
    @目录JavaScriptJavaScriptBOM对象JavaScriptDocument对象JavaScript事件处理JavaScript变量JavaScript函数基础JavaScript流程控制JavaScript数据类型JavaScript数组JavaScript运算符JavaScript正则表达式JavaScript字符串函数TypeScript简单示例JavaScriptJavaScriptBOM对......
  • SpringBoot整合JavaMail
    第一步:第二步: 第三步:第四步: ......
  • Java分布式框架之Dubbo
    分布式与微服务 1、传统架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。存在的问题:代码耦合,开发维护困难无法对不同模块进行针对性优化无法水平扩展单点容错率低,并......