java序列化实现原理和深度分析

Java异常链传递:深度解析initCause()与构造方法的区别 Java异常链机制解析与实践指南 异常链是Java中记录异常因果关系的重要机制,主要通过两种方式实现:构造方法传递和initCause()方法传递。构造方法传递更高效且线程安全,适合大多数场景;而initCause()提供了更灵活的异常设置方式。性能测试显示构造方法比initCause()快约1.68倍。最佳实践建议在直接包装异常时使用构造方法,需要条件判断时考虑initCause()。需注意避免重复设置cause、自引用等常见陷阱。Spring和Hibernate等主流框架均广泛使用异常链机制,其中Spr 阅读详情

java序列化

什么是序列化?

对象和二进制的转换。

转换的目的是啥?

对象转换为二进制,然后再把二进制恢复为对象。

具体应用场景是,把对象写到磁盘文件,或者更常见的就是把对象传到远程机器(比如,dubbo rpc框架)。

什么是java序列化?

java序列化特殊一点点,是对象和字节数组( byte[] )的转换。但是,字节数组的本质也是二进制。

序列化的作用?

所以,无论是其他语言,还是java语言的序列化,本质作用都是为了从磁盘文件或者远程机器恢复对象。


官方文档介绍

Serialization is used for lightweight persistence and for communication via sockets or Java Remote Method Invocation (Java RMI).

https://docs.oracle.com/javase/7/docs/technotes/guides/serialization/index.html

如何实现序列化?

实现序列化接口

public class Person implements Serializable {     
  private static final long serialVersionUID = 2709425275741743919L; 
}

demo

pojo类,主要是要实现序列化接口。

package test2;

import java.io.Serializable;

public class Person implements Serializable { //实现序列化接口

  private static final long serialVersionUID = 1L;

  private String name;
  private Integer age;
  private String address;

  public Person() {
  }

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


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

测试类,核心步骤

  1. 序列化

把对象转换为二进制(即字节数组),然后写到磁盘文件

2、反序列化

从磁盘文件恢复对象,其实就是把二进制再转换为对象

package test2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * @author gzh
 * @createTime 2021/12/6 8:08 PM
 */
public class Test {

  public static void main(String[] args) throws Exception {
    testversion1L();
  }

  public static void testversion1L() throws Exception {
    File file = new File("Person.out");
    // 序列化
    ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));
    Person Person = new Person("Haozi", 22, "上海");
    oout.writeObject(Person); //把对象转换为二进制(即字节数组),然后写到磁盘文件
    oout.close();

    // 反序列化
    ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));
    Object newPerson2 = oin.readObject();//从磁盘文件恢复对象,就把二进制转换为对象
    oin.close();
    System.out.println(newPerson2);
  }
}

java序列化到底干了什么?协议格式是什么?

最主要和最本质其实也是把对象转换为二进制。

格式就是,java独特的那一套东西,主要包括:

  1. java基础数据类型
  2. java非基础数据类型

所以,总之,java序列化的二进制,只有java语言自己能够识别,即只有java语言自己才可以把二进制再恢复转换为对象。


源码分析参考:

https://juejin.cn/post/7039166805448851463#heading-2

序列化id的作用到底是什么?

jdk api官方文档

Serializable

If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java™ Object Serialization Specification.

However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization.

Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value.

It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class–serialVersionUID fields are not useful as inherited members.

总结

序列化id,本质是pojo类的版本号。

  1. 如果没显式写序列化id,jvm默认生成一个随机值。
  2. 如果写了,一般情况下,值写1L就可以了。

用idea生成一个很大的随机值也可以。

  1. 官方推荐,最好显示写一个值(一般情况写1L就可以了)——因为jvm的实现可能不一样,导致消费者和提供者的jvm生成的版本号不一样。
  2. 如果提供者新增了字段或者修改了字段类型,就要升级序列化id版本,这样的话,提供者反序列化的时候就会异常:消费者和提供者的序列化id版本不一致。这正是我们要的结果——因为如果提供者新增了字段或者修改了字段类型,但是提供者没有升级序列化id版本,而是仍然和提供者的版本一样,那么提供者反序列化的时候就不会异常,但是这个时候,提供者的新增字段的值是null(提供者新增了字段)或者类型转换异常(提供者修改了字段类型)。

demo

接着上面的demo代码例子,这里再演示一下。

先给提供者的pojo类加个字段-email。

package test;

import java.io.Serializable;

public class Person implements Serializable {

  private static final long serialVersionUID = 2L;

  private String name;
  private Integer age;
  private String address;
  private String email; //新增字段

  public Person() {
  }

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

  public Person(String name, Integer age, String address,String email) {
    this.name = name;
    this.age = age;
    this.address = address;
    this.email = email;
  }

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

然后,直接从上面demo已经生成的文件里反序列化,得到对象。注意,要注释掉序列化代码。

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import test2.Person;

/**
 * @author gzh
 * @createTime 2021/12/6 8:08 PM
 */
public class Test {

  public static void main(String[] args) throws Exception {
    testversion1L();
  }

  public static void testversion1L() throws Exception {
    File file = new File("Person.out");
    // 序列化
//    ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file));
//    Person Person2 = new Person("Haozi", 22, "上海");
//    oout.writeObject(Person2);
//    oout.close();

    // 反序列化
    ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file));
    Object newPerson2 = oin.readObject(); //得到对象
    oin.close();
    System.out.println(newPerson2);
  }
}

打印结果:

Person{name='Haozi', age=22, address='上海', email='null'}

说明:

  1. 提供者必须也要有对应类pojo类

从打印结果看,直接从磁盘文件反序列化可以得到对象,前提是提供者也要存在同一个包同一个类名字的pojo类,提供者才可以创建对象。

如果提供者没有对应的pojo类,就会报错:找不到类异常。

Exception in thread "main" java.lang.ClassNotFoundException: Person
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
	at Test.testversion1L(Test.java:27)
	at Test.main(Test.java:14)

如何模拟这个异常?直接把pojo类删除或者换个名字即可。

  1. 提供者新增字段的值为什么是null?

如果提供者有对应的pojo类,提供者就可以从磁盘文件的二进制数据,创建对象,正如上面的打印结果。但是,由于提供者新增了一个字段,而消费者写入二进制数据到磁盘文件的时候并没有这个字段,所以新增的字段的值是null。

但是,实际工作当中,我们应该不允许这种情况出现。如果提供者新增了字段,pojo类要升级一下版本,即序列化id的值改为2L。

继续往下分析,正如上面的例子,消费者写入磁盘的二进制数据的版本是1L,这个时候,提供者反序列化会报错:版本号不匹配,具体来说是,流(即消费者)的版本号是1,本地(即提供者)的版本是2。

Exception in thread "main" java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
	at Test.testversion1L(Test.java:27)
	at Test.main(Test.java:14)
Disconnected from the target VM, address: '127.0.0.1:0', transport: 'socket'

Process finished with exit code 1

虽然这个时候异常了,但是这正是我们想要的结果。因为可以一眼看出来,消费者和提供者的pojo版本不匹配,背后的本质肯定是提供者新增了字段或者修改了字段的类型。这个时候,消费者,也应该新增字段或者修改字段类型,和提供者保持一致。如果提供者没有升级版本号,虽然提供者没有报错,但是提供者新增字段的值是null(因为消费者缺少该新增字段),这个时候其实反而是有问题的,因为正常情况下提供者新增了字段,肯定是要是使用该字段的值的,值从哪里来?肯定是消费者来。消费者怎么来?也新增字段,并且和提供者版本保持一致即可解决问题。

参考

https://www.liaoxuefeng.com/wiki/1252599548343744/1298366845681698

Java serialVersionUID 有什么作用?https://www.jianshu.com/p/91fa3d2ac892

深入解析XStream反序列化漏洞(CVE-2021-29505):从原理到实战利用 本文深入解析了XStream反序列化漏洞CVE-2021-29505的原理与利用方式。该漏洞允许攻击者通过构造恶意XML数据,绕过XStream的黑名单防御机制,最终在目标系统上实现远程代码执行。文章详细剖析了漏洞利用链,并提供了从实战复现到彻底修复(升级至1.4.17+并启用白名单)的完整防御指南。 阅读详情

相关推荐

源码分析kryo对象序列化实现原理

kryo对象序列化入口为Kryo的writeClassAndObject。 Kryo#writeClassAndObject 1public void writeClassAndObject (Output output, Object object) { 2 if (output == null) throw new IllegalArgumentException("output c...

weixin_44195108的博客 2062

java序列化基本原理总结_详解Java的序列化机制

Java的序列号机制允许将对象转换成与平台无关的二进制流,从而实现对象保存到磁盘、在网络中传输等。Java中通过实现Serializable接口,标识对象序列化。查看源码可发现,Serializable接口不包含任何方法和域,只是起到标识作用:图1: Serializable接口一、序列化原理1、每个序列号的对象都是采用了一个序列号进行保存2、当序列化一个对象时,程序将检查该对象是否已经序列化过:...

weixin_32734545的博客 1900

Java深度拷贝实现与详解

本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Java中使用反射机制实现深度拷贝的方法和注意事项。深度拷贝能创建一个包含所有引用对象的新对象,避免了修改副本影响原始对象的问题。文章解释了浅拷贝与深度拷贝的区别,以及如何利用Java的反射机制来实现深度拷贝,并阐述了其优缺点。同时,也提到了通过序列化反序列化和第三方库实现深度拷贝的其他方法。 1. Java...

weixin_34392511的博客 2814

【Java 基础篇】Java序列化与反序列化详解

本文详细介绍了Java序列化和反序列化的原理、使用方法和常见应用场景。通过实现接口,可以实现对象的序列化和反序列化。序列化和反序列化是一种重要的机制,可以实现对象的持久化存储、网络传输和缓存等功能。希望本文对你理解和应用Java序列化与反序列化有所帮助!

繁依Fanyi的博客 7370

掌握Kryo序列化:Java高效对象序列化框架

随着大数据时代的到来,高效的数据处理和传输变得越来越重要。Kryo,一个轻量级的Java序列化框架,正是在这样的背景下应运而生。其高效的性能、小巧的体积和易于使用的特性,使它在需要高性能序列化的场景中脱颖而出。Kryo序列化框架最初由Jonathan Robie创建,用于优化那些依赖于快速序列化的应用程序。它的设计宗旨是减少序列化和反序列化时所占用的内存空间,并且加快处理速度。

weixin_29050829的博客 761

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

【Java编程进阶之路 07】深入探索:Java序列化的深层秘密 & 字节流

Java序列化是将Java对象的状态转换为字节流的过程,以便在网络中传输、保存到文件中或进行持久化存储。序列化后的字节流可重建为原始对象,即反序列化。序列化常用于远程方法调用、对象持久化、深拷贝及数据传输等场景。但需注意,反序列化可能带来安全风险,且类版本变化可能影响兼容性。因此,使用序列化时需谨慎考虑安全性和版本控制。

weixin_40736233的博客 1333

[Ethernet in CANoe]4--CANoe工程中SOME/IP报文的详细介绍(二)

介绍了SOME/IP报文的SD报文(ServiceDiscovery),本片文章开始继续介绍SOME/IP报文。

汽车ECU自动化测试 1111

Java 序列化和反序列化的底层原理,从零基础到精通,收藏这篇就够了!_java pb序列化教程

反序列化其实就是序列化的逆向过程,如果你看懂了序列化的关键代码,那么看这个过程就不会很难,下面贴出关键代码做出分析这里能够看到会根据反序列对象的具体类型分别做不同的处理,我们当前的对象是 User 对象所以会进入箭头指向的方法。

bdfcfff77fa的博客 953

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 902

【KBrowser】基于 Kiwi/chromium 制作全新外壳,将 chromium 代码当作 webview 使用,实现可控核替换

chromium 其实只需几步巧妙的架构,就能拿来“换核”,甚至可以插件化,实现类似webview.apk 的效果。重新设计界面,不再是差不多的回声。而 Kiwi 基于 chrome 77 ,只有 50 MB。优势是兼容好、可安装扩展。

sinat_27171121的博客 2028

深入理解Java序列化的原理

序列化是将对象转换为可传输格式的过程。是一种数据的持久化手段。一般广泛应用于网络传输,RMI和RPC等场景中。几乎所有的商用编程语言都有序列化的能力,不管是数据存储到硬盘,还是通过网络的微服务传输,都需要序列化能力。本文将探索JAVA序列化原理

小徐的博客 1138

AI应用架构师实战:超算中AI与量子计算融合的初探与架构

当大模型的算力需求突破E级超算的极限,当量子计算的“量子优势”从实验室走向真实场景,超算+AI+量子计算的融合架构成为解决复杂问题的关键路径。本文从架构师的实战视角出发,系统拆解三者融合的底层逻辑:从“计算本质”的第一性原理推导,到“量子-经典异构”的架构设计;从“量子机器学习”的代码实现,到“金融/医药”的场景落地。我们将回答:如何用超算支撑量子计算的噪声抑制与纠错?如何用量子计算加速AI模型的训练与推理?如何设计可扩展、高可用的融合系统?最终给出架构师的实战指南——从技术选型到运营管理的全流程方法论。

AIGC应用创新大全的博客 923

java 序列化实现原理和深度分析

java 序列化实现原理和深度分析

weixin_49376454的博客 1018

手把手教你学GPU的KMD专栏--3.1 设备初始化流程深度解析

本文深入解析了KMD(内核模式驱动)设备初始化流程,这是GPU驱动开发最基础且关键的环节。初始化流程包括6个核心阶段:KMD模块加载、PCIe设备探测匹配、GPU硬件初始化、显存分配映射、中断系统配置和设备注册。每个阶段都有详细步骤解析,涉及关键数据结构和错误处理机制。文章还分析了常见问题(驱动加载失败、显存分配失败、中断配置失败)的解决方案,并指出未来趋势将向动态初始化、安全增强和AI优化方向发展。正确高效的初始化流程是确保GPU被操作系统安全使用的前提,也是后续内存管理、任务调度等功能的基础。

MHD0815的博客 261

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

Robot_PLC_HMI_Automation 3289

java之浅拷贝、深拷贝

这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。在深度拷贝中,需要被拷贝的对象中的所有引用数据类型都实现Cloneable()接口并且重写clone()方法,如果一个对象有好多引用数据类型,则比较费劲,有没有其他方法呢?使用clone()方法时,必须实现该接口并且复写clone()方法。PeoSon{age=123, book=Book{bookName=‘java从入门到入坟’, price=10}}

qq_41163858的博客 2390

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 577

分布式通信

Java 序列化机制 Serialize接口 java本身的序列化机制存在的问题: 序列化数据结果比较大、传输效率比较低 不能跨语言对接 序列化的发展 以至于在后来的很长一段时间,基于XML格式编码的对象序列化机制成为了主流,一方面解决了多语言兼容问题,另一方面比二进制的序列化方式更容易理解。以至于基于XML的SOAP协议及对应的WebService框架在很长一段时间内成为各个主流开发语言的必...

花开不合阳春暮 803

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java一些经验总结记录

Java高级面试核心摘要 本文系统梳理了Java高级面试中的两大核心领域:JVM深度解析和并发编程进阶。在JVM部分,详细讲解了Java内存模型(JMM)的三大特性、内存区域划分及OOM异常、垃圾回收算法与收集器对比(G1/ZGC/Shenandoah)、类加载机制及双亲委派模型。并发编程部分重点剖析了线程池参数配置与拒绝策略、synchronized与volatile的底层差异、ThreadLocal原理及内存泄漏防范、AQS框架实现原理等核心知识点。内容覆盖大厂高频面试题,从底层原理到实战应用都有深入解

一名资深全栈开发工程师的博客 766

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Objenesis vs 反射 vs Unsafe:3种Java对象创建方式深度对比,如何选型?

**Objenesis** 是一个专为"绕过构造函数创建 Java 对象"而设计的开源库。标准反射搞不定的场景——没有无参构造器、构造函数会抛异常、需要跳过构造逻辑——它都能优雅解决。本文深度对比 Objenesis、标准反射与 Unsafe 三种 Java 对象创建方式的原理、性能差异和适用场景,并给出清晰的选型建议,帮你一次选对方案。 ## 为什么标准反射"不够用"? 在日常开发中,`ne

gitblog_01041的博客 478

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java全栈面试复盘:从HashMap到Vue响应式原理的完整知识串讲

在Java开发者的技术成长路径中,全栈能力已成为衡量工程综合素养的重要标准。无论是HashMap底层的数据结构与哈希冲突处理,还是JVM内存模型与线上OOM排查,这些Java核心技术点都考验着开发者对原理的深度理解。与此同时,前端框架的响应式原理、组件通信方式以及虚拟DOM的diff策略,同样是全栈岗位面试中绕不开的高频考点。理解了这些底层机制,不仅能帮助开发者从容应对技术问答,更能指导实际项目中的架构设计与性能优化。从集合框架到并发编程,从Spring生态到前端工程化,系统性串联知识体系才是突破面试瓶颈的

weixin_33582089的博客 331

从原理到实战:Java序列化与反序列化深度解析

摘要: Java序列化与反序列化是实现对象跨环境流转的核心技术,支撑持久化存储、分布式通信及微服务等场景。其原理包括类元信息记录、字段递归编码和对象引用去重。规范使用需显式声明serialVersionUID,谨慎处理transient字段,并优化性能(如减少序列化字段、使用缓冲流)。安全方面需警惕反序列化漏洞,建议替换为JSON或Protobuf等方案,并校验输入。未来趋势偏向二进制协议(如Protobuf)和安全框架,以适应云原生和跨语言需求。掌握这些能力可提升系统性能与安全性,满足分布式架构演进需求。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1329

深入理解Java序列化机制:ObjectOutputStream源码简要分析

一、引言 java.io.ObjectOutputStream是实现序列化的关键类,它可以将一个对象转换成二进制流,然后可以通过ObjectInputStream将二进制流还原成对象。 在阅读ObjectOutputStream源码之前,我们先来回顾一下序列化相关的基础知识: 1、需要序列化的类必须实现java.io.Serializable接口,否则会抛出NotSerializableEx...

APlus 1万+

java中实现对象的深度克隆

1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两个完全不相关的对象,而浅拷贝不拷贝对象所用的数据资源等,虽是两个不同的参数标识符,但是用的是同一个数据对象,也就是用‘==’,这是浅拷贝。也就是C语言中形容的指针指向的物...

朱宏的博客 6115

Hadoop序列化机制深度解析:从设计原理到性能影响

Hadoop序列化体系的核心是Writable/*** 将对象序列化到输出流/*** 从输入流反序列化填充对象DataOutput;/*** 将对象序列化到输出流/*** 从输入流反序列化填充对象DataInput;/*** 将对象序列化到输出流/*** 从输入流反序列化填充对象/*** 将对象序列化到输出流*//*** 从输入流反序列化填充对象*/关键设计。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2835
上一篇: Linux常用命令-如何操作文件?
下一篇: redis如何解决高可用问题?
Java个体户
博客等级 码龄6年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值