• 👻 小二
    2019-08-20
    尝试回答一下问题:
    内存里存的东西,不通用, 不同系统, 不同语言的组织可能都是不一样的, 而且还存在很多引用, 指针,并不是直接数据块。
    序列化, 反序列化, 其实是约定一种标准吧, 大家都按这个标准去弄, 就能跨平台 , 跨语言。

    作者回复: 这个总结好,简单明确,赞!

    
     50
  • 游弋云端
    2019-08-17
    需要面临的问题:
    1、网络字节序与主机字节序问题,业务要感知和处理大小端问题;
    2、平台差异,各平台对基本数据类型的长度定义不一致、结构体对齐策略不一致,无法实现平台兼容;
    3、连续内存问题,一个对象可能引用,指向其他对象,指针就是一个地址,传输后在另外的设备上是无效值;

    如果解决这些问题了,也变相的实现了自己的序列化框架了。
    展开
    
     17
  • a、
    2019-08-17
    1.因为应用程序里的对象,除了属性和属性值以外,还有一些其他的信息,比如jdk编译的版本,类的全限定名,类继承的父类和实现的接口等信息。如果服务端是jdk1.8编译的对象,发给客户端,客户端用的是jdk1.7,肯定会报错。
    2.这些其他的信息是多余的,传输中会增加网络负担
    
     16
  • ly
    2019-08-19
    个人对今天的内容进行简单的描述:
    1. 序列化:是一种规则,它定义了数据表达的规则;
    2. 反序列化:依靠给定的规则,还原数据。
    3. 今天的问题:
    内存中的对象数据应该具有语言独特性,例如表达相同业务的User对象(id/name/age字段),Java和PHP在内存中的数据格式应该不一样的,如果直接用内存中的数据,可能会造成语言不通。通常两个服务之间没有严格要求语言必须一致,只要对序列化的数据格式进行了协商,任何2个语言直接都可以进行序列化传输、接收。
    展开

    作者回复: 👍👍👍

    
     6
  • 许童童
    2019-08-17
    内存在每个平台的分布都是不一样的,一个对象不光有用户定义的属性,还包括平台定义的属性,如果不经过序列化就传输过去,一方面会浪费大量的带宽,另一方面还可能因为平台不同等问题导致不兼容,从而无法解析。
    
     4
  • 星愿
    2019-10-21
    Jmq用的啥序列化框架呢

    作者回复: 和其它的MQ的实现是类似的,自身的命令用的专用序列化,消息本身如何序列化是由业务代码决定的。

    
     2
  • Switch
    2019-10-12
    在内存中,存放的对象也是有相应的结构的。如果直接保存,直接读取,那么也需要有相应的转换器,将数据转换为内存中的对象。而且这样的对象,不通用,换一种语言或者实现就不能通用了,并且这样的对象不一定是最节省空间的。
    我们损失一部分性能,换取跨语言性、节省存储空间也是一种两者取较好的选择。
    
     2
  • 楚翔style
    2019-08-30
    序列化:把对象转成通用格式数据(byte json)
    反序列化:通用格式转成服务端能认的对象,比如json->Java Object
    
     1
  • godtrue
    2019-08-23
    课后思考及问题
    1:课后,你可以想一下这个问题:在内存里存放的任何数据,它最基础的存储单元也是二进制比特,也就是说,我们应用程序操作的对象,它在内存中也是使用二进制存储的,既然都是二进制,为什么不能直接把内存中,对象对应的二进制数据直接通过网络发送出去,或者保存在文件中呢?为什么还需要序列化和反序列化呢?
    非常赞,老师的这个问题太经典了,可以拓宽认知边界。
    具有细节,我不清楚,不过大概知道原因,比如:
    1-1:JAVA说01表示TRUE,PHP说01表示我是世界上最好的语言
    1-2:Mac说01表示1,Windows说10表示1
    1-3:虽然0/1在计算机的世界里,可以组合表示万事万物,比如:文字、图片、音频、视频、数据、指令等等,但是不同的语言、操作系统、硬件体系并没有被一个唯一的皇帝统一,他们的标准和存储方式都是有差异性的。所以,字符集有N多种就是这样,同样一个字符0在不同王国有不同的含义。

    2:看了老师的讲解,感觉自己也能自定义一个序列化和反序列化的框架,可能性能、通用性待优化。我的问题是,如果我想自己实现一个这样的框架,该怎么思考才能实现的更好?Jd自研的是怎么思考的?或者换个问法,老师在自研时是怎么考虑和设计的,有什么坑没?性能如何?关键想知道怎么自研的?
    展开

    作者回复: 近期会发一个加餐来解答你的问题。

     1
     1
  • 南辕北辙
    2019-08-21
    个人理解,序列化与反序列化的通用思想和通信协议挺类似的,只要通信双方约好什么样的格式去定义数据,想怎么玩就怎么玩。
    
     1
  • Kylin
    2019-11-26

    03 | 08 7a 68 61 6e 67 73 61 6e | 17 | 01
    User | z h a n g s a n | 23 | true
    类似erlang的序列化方式
    
    
  • 业余爱好者
    2019-11-24
    从语义上理解序列化与反序列化,序列化就是把内存中结构化的对象转化为跨平台的可以在网络上传输的二进制“流”。关键词是流,也就是说,它是一个线性的数据结构。而在内存中的数据是结构化的,非线性的,而且各个平台,各种语言的存在方式还不一样。

    序列化就是把要传输的信息从专用的表示方式转换为通用的二进制流的表示方式。反序列化的过程刚好相反。

    虽然都是二进制,不过信息的编码方式不同。
    展开
    
    
  • 淡定的、王先森
    2019-10-27
    想问下老师,在项目开发中,什么时候需要显式的实现对象的序列化,或者用到序列化?感觉日常开发中并没有涉及,或者应用的框架给做了我并没有察觉到? 大多数项目都是怎么设计序列化的呢?请老师提示或指教下,不胜感激

    作者回复: 你在使用消息队列的时候,发消息之前就需要对消息进行序列化,收到消息再反序列化。

    可能你日常发送的都是String类型的消息,没有意识到?

    比如,你要通过消息发送一个有结构的对象到对端,就需要把这个对象序列化。

    
    
  • 布小丫学编程
    2019-09-16
    不知道是什么类型的数据,每个程序对字段的解析规则都不一样。二进制解析都需要自定义好协议后才可以解析的,比如协议头编码格式等等都不一样。
    
    
  • 毛露
    2019-08-21
    想到了tcp报文。。
    
    
  • 青莲
    2019-08-20
    序列化和反序列化前提条件是,以什么样的格式或约定的协议对内容进行解析,内存中的二进制具有特定语方的协议,只在当前运行的应用环境有效;
    
    
  • humor
    2019-08-19
    内存中的对象并不是独立存在的,他们会有各种引用关系,直接存储的话,可能存储的很多都是内存地址吧
    
    
  • leslie
    2019-08-19
    打卡:没太想明白,不过问题记在大脑里总归会想出点东西。
    
    
  • oscarwin
    2019-08-19
    虽然都是二进制的数据,但是序列化的二进制数据是通过一定的协议将数据字段进行拼接。第一个优势是:不同的语言都可以遵循这种协议进行解析,实现了跨语言。第二个优势是:这种数据可以直接持久化到磁盘,从磁盘读取后也可以通过这个协议解析出来。如果是内存中的数据不能直接存盘的,直接存盘后再读出来我们根本无法辨识这是个什么数据。

    作者回复: 👍

    
    
  • 💪😊
    2019-08-19
    内存数据要搭配元数据定义,这个定义在不同语言平台等兼容非常难通用。拿内存本身也不是特别容易的事情
    
    
我们在线,来聊聊吧