序列化是将对象转换为字节流,为什么将对象转换为Json ...

论坛 期权论坛 股票     
期权匿名问答   2023-2-14 20:33   3586   5
序列化是将对象转换为字节流,为什么将对象转换为Json字符串也叫序列化?json序列化和字节流序列化的关系是什么?TCP/IP网络传输只支持字节流,那json序列化后的字符串传输的时候JVM是会自动将其转换为二进制吗?
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2023-2-14 20:33:27 发帖IP地址来自 中国
我看了好多答案,很惊讶,因为没人提到 Java 的序列化也有 XML 格式这个选项,这个功能是我 2007 年离开 Java 开发前就有的。
3#
期权匿名回答  16级独孤 | 2023-2-14 20:34:04 发帖IP地址来自 北京
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。[1]
可以看到,序列化是把对象转换为可以传输,或者可以存储的形式的过程,前者是把对象转换为字节流,后者是把对象转换为字符串存储在本地。
java的JSON序列化可以用jackson之类的库,这个我不太了解,但是python的JSON序列化可以使用json模块(内置模块)的dump方法和dumps方法来序列化为字节流或者字符串。
在计算机网络模型中,tcp/ip协议位于第三层,也就是主机网络层,在这层中数据传输只支持数据流,也就是二进制的数据,但是http协议等协议,是位于tcp/ip协议层之上的,以http协议为例,他位于应用层,在计算机网络数据中,数据从高层流向底层,会经过封装和编码(封装报头,将数据报转换为数据流),这些都由计算机帮你实现。
所以实际上在python中dump方法使用并没有dumps多(前者是字节流,后者是字符串),因为你最终要用http协议去传输,他会自己转化为字节流传输,我们直接转化为字符串即可,剩下的交由协议处理即可。
4#
期权匿名回答  16级独孤 | 2023-2-14 20:34:23 发帖IP地址来自 中国
序列化是将对象转换为字节流
这是谁给的定义?不如看看维基怎么说?
序列化(serialization)在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式
字节流只是一个媒介。何必一定是「字节」,一定是「流」?争辩字符串算不算字节流没必要。
5#
期权匿名回答  16级独孤 | 2023-2-14 20:35:02 发帖IP地址来自 北京
题主是不是对字节流有什么误解。json串不就是字节流么?
不过,我大概明白为什么你会产生这种误解,因为你对json的了解仅限于调用java库。而java库并没有让你直接访问json字节流,而是把它转化为java字符串传输给你。——由于你得到的是java字符串,所以就产生了「json不是字节流」的误解。
如果你使用其它相对底层的语言(比如cJSON)来解析,是应该可以清楚的知道json就是字节流的。
所以解释一下吧:json的标准格式是字节流。你获得的json如果是在java字符串中,它已经是从字节流转化为java字符串后的结果了,不是原始json字节流。而这个java字符串在作为json传输时,需要再转化为原始json字节流去传输。
这种误解其实是你手头的java解析库造成的,多了解一下json的定义可以消除这个误解。
6#
期权匿名回答  16级独孤 | 2023-2-14 20:35:56 发帖IP地址来自 北京
序列化可以理解为内存对象dump出内存表示,以方便外部的传输存储,比如一个c语言的结构体
typedef struct {
    int age;
    char name[10];
} Person;这里有一个Person的对象对吧. 我现在要把它传输给接收方.怎么办呢. 一个内存对象怎么能够被传输呢? 因为内存对象有一个特殊性.

  • 特定地址:

    • 比如我这内存里面是在 0x88888888 位置. 但是对方的内存里面这个地址已经有其它数据了怎么办

  • 结构化:

    • 比如上面这个对象. 有两个字段. 有可能递归的包含别的对象.

  • 对方系统要有此定义才行. 否则无法使用.和初始化
这些都看起来让一个对象无法被传输. 这个时候就可以把一个对象序列化.
序列化, 简单说就是以某种约定的格式把一个内存对象在外部把其信息dump出来并表示和保存起来. 而至于说格式.这个因场景而定.
你可以使用一个string如: “10,张三”这样的字符串来表示这个序列化后的对象的值. 使用这种方式就只保存了值.没有保存结构. 比如10代表什么.  这里表示age 但是序列化后的数据中并没有这个信息. 这种情况下就需要双方约定. 比如这里的逗号前的是年纪.后面是姓名.
如果要同时传输多个对象. 且其结构还不确定. 比如还有一个对象是: Car. 那我要把car和Person一起传输给对方. 那序列化的数据里面必须能够区分哪个对象是哪个数据结构才行.
比如我得到如下的序列化数据:
type:Person|10,张三;type:Car|xxxx这样两个数据都被传输过去了,同时也能区分每一个对象是什么.
你发现没有,序列化后的东西并没有说一定是字节流. 只要你定义好格式能存储必要的信息即可. 同理,也可以使用你这里提到的JSON.
双方只要按照约定把数据序列化为JSON. 对方接收到后再反序列化为内存对象即可.
上面说的内存地址不一样怎么办?
这个其实是多虑了. 我们不会严格要求他们保持一致. 只要能够完成我们的业务需求即可. 两边不必保持地址一致.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP