首页 > 编程语言 >Java 序列化与反序列化的疑问

Java 序列化与反序列化的疑问

时间:2023-09-21 23:23:40浏览次数:53  
标签:Java 字节 jdk JSON 数组 序列化 疑问

关于序列化和反序列化的疑问

  1. 为什么需要序列化和反序列化 ?

    因为计算机底层存储和传输都是二进制,所以需要将对象转化成字节数组。那么问题来了,只需要转成字节数组就行了,那为啥还要弄这么多东西?搞这么复杂?

    因为直接转生成的字节数组是不规则的,所以我们不能通过这样的字节数组把原来的对象还原出来,那么我们就必须生成有规则的字节数组,而序列化就是这样一种规则,根据某种规则把对象转成字节数组(序列化),反序列化就是利用这种规则把字节数组还原成对象(反序列化

  2. 为什么有些实体类要继承Serializable才能序列化,而controller里,发送和接受的数据里不需要?

    因为序列化只是定义了拆解对象的具体规则,那这种规则肯定也是多种多样的,比如现在常见的序列化方式有:JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。

    JDK原生: 实现Serializable接口;JDK 原生的序列化方式生成的字节流比较大,也不支持跨语言,因此在实际项目和框架中用的都比较少

    ProtoBuf: 谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统

    Hessian: Hessian 是一个轻量级的二进制 web service 协议,主要用于传输二进制数据。

    在传输数据前 Hessian 支持将对象序列化成二进制流,相对于 JDK 原生序列化,Hessian序列化之后体积更小,性能更优。

    Kryo: Kryo 是一个 Java 序列化框架,号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势,底层依赖于字节码生成机制。

    由于只能限定在 JVM 语言上,所以 Kryo 不支持跨语言使用。

    JSON: 上面讲的几种序列化方式都是直接将对象变成二进制,也就是byte[]字节数组,这些方式都可以叫二进制方式。

    JSON 序列化方式生成的是一串有规则的字符串,在可读性上要优于上面几种方式,但是在体积上就没什么优势了。

    另外 JSON 是有规则的字符串,不跟任何编程语言绑定,天然上就具备了跨平台。
    总结一下:JSON 可读性强,支持跨平台,体积稍微逊色。

  3. 假如请求响应 用的是jdk的序列化,那么前端应该怎么读取呢
    感觉是读取不了,但是使用Java rmi应该可以读取吧?

  4. Java rpc 可以使用jdk序列化 ?可能要去看看rpc的实现方式
    猜测1 jdk序列化后的是字节数组,传输的是字节数据,响应中应该有标识着这是jdk序列化的数据,然后rpc调用放就会采用jdk的方式读取

  5. 为啥ruoyi序列化采用的是json但还是实现了jdk的Serializable接口
    猜测1 rpc调用 OpenFeign 底层用的是Java rmi (猜测),所以为了方便就序列化(×)
    猜测错了,openfeign 采用的负载均衡,找到url,然后发起http请求
    问了文心一言回答是:

虽然实现了Serializable接口,但RuoYi在实际应用中可能并不会使用Java原生的序列化机制。
相反,它可能使用其他的序列化库(如Jackson)来实现JSON序列化和反序列化操作。
因此,Serializable接口在这里更多地作为一种备用或者扩展的序列化机制存在。

我的觉得有点道理在

以上都是我的思考和查询资料所得,还有一些猜测,仅作为自我学习的记录

部分参考资料

标签:Java,字节,jdk,JSON,数组,序列化,疑问
From: https://www.cnblogs.com/fang-si/p/17721228.html

相关文章

  • 用javaweb技术设计一个网页需要什么软件
    对于使用JavaWeb技术设计一个网页,需要准备以下软件:JavaDevelopmentKit(JDK):这是Java开发的基本工具包,包括Java编译器、运行时环境和其他工具。IDE(集成开发环境):常见的JavaWeb开发IDE包括Eclipse、IntelliJIDEA和NetBeans。这些IDE提供了代码编辑、调试和部署等功能,使开发......
  • Java基础
    Java基础一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。基本语法大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字......
  • 一文读懂Java输入输出:编程新手必看
    输出在前面的代码中,我们总是使用System.out.println()来向屏幕输出一些内容。println是printline的缩写,表示输出并换行。因此,如果输出后不想换行,可以用print():注意观察上述代码的执行效果。格式化输出Java还提供了格式化输出的功能。为什么要格式化输出?因为计算机表示的数据不一定......
  • java--内存与数据结构
    JVM内存划分 栈一种数据结构特点:先进后出(FILO)入栈:把元素放到栈里栈顶:栈中的第一个元素栈底:栈中的最后一个元素出栈:把元素从栈里移除   基本数据类型–值传递 引用类型–地址传递 堆数组在堆中存储 若堆中的内存空间没有被引用的时候,就会变成垃圾,等着......
  • Java基础语法(1)
    Java基础语法JAVA--黑马程序员笔记一、Java入门1、JAVA是一种很火的计算机语言。2、JAVA代码编写分三步:编写程序源码,即编写一个java文件编译:翻译文件,javac是JDK提供的编译工具,对java文件编译后会产生一个class文件,class文件即交给计算机执行的文件。Eg:javachell......
  • JAVA基础学习——面型对象进阶
    1static2继承   1static1.1内存图静态对象是随着类加载,非静态对象随着对象来的: 引用类型初始化时null值。 1.2static静态变量、静态方法 1.3总结  ①静态方法中没有this,非静态方法中有静态的一般用于共享,不面向某一个对象,所以没有this;而非......
  • 如何生成javaDoc文档
    命令行方法打开IDEA的showinexplore,在文件夹路径前输入cmd打开命令窗口输入javadoc-encodingUTF-8-charsetUTF-8文档名.java成功后就可以在该文件夹下看到生成的javaDoc文档注:打开IDEAshowinexplore的方法-encodingUTF-8-charsetUTF-8是为了防止中......
  • 4.6 Java成员方法的声明和调用
    声明成员方法可以定义类的行为,行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是用方法来实现的,属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型,其结构如图1所示。 图1 方法组成元......
  • 4.7 Java this关键字详解(3种用法)
    this关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。下面我们根据示例分别讲解this关键字的作用。this.属性名大部分时候,普通方法访问其他方法、成员变量时无须使用this前缀,但如果方法里......
  • java8 新特性之日期时间处理 LocatDate、LocalTime、LocalDateTime、ZonedDateTime、D
    一、LocalDate、LocalTime、LocalDateTime和常用API1、LocalDatepublicvoidtest01(){//1.创建指定的日期LocalDatedate1=LocalDate.of(2021,05,06);System.out.println("date1="+date1);//2.得到当前的日期LocalDate......