• R语言
  • serialize() 的前17 位表达的具体是什么信息?

我在看 digest 包里的这行代码时,发现一个来源不甚明确的魔法数字 14,我很好奇为什么是丢弃 serialize() 的前 14 位。我简单跑了几个例子,感觉应该是 17:

> serialize(NULL, NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 fe
> serialize('a', NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 04 00 09 00 00 00 01 61
> serialize('\n', NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 04 00 09 00 00 00 01 0a
> serialize(TRUE, NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0a 00 00 00 01 00 00 00 01
> serialize(NA_character_, NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 00 00 09 ff ff ff ff
> serialize(1, NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0e 00 00 00 01 3f f0 00 00 00 00 00 00
> serialize(1:10, NULL)
 [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0d 00 00 00 0a 00 00 00 01 00 00 00 02 00 00 00
[34] 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00 0a

这些不同对象的前 17 位似乎都是一样的。它们具体存储着什么信息我不是很清楚,理论上有个版本信息(serialize() 函数有个 version 参数),不知谁能给我“解码”一下。我估计得看 R 的源代码,凭我有限的阅读理解能力,只能找到这里了,这些代码是什么意思,我也不懂。

第一位 58 应该是字符 X,表示二进制数据(A 表示 ASCII 数据,在 ?serialize 帮助文档中略有提及),0a 是换行符 \n,剩下的我两眼完全懵圈。

又及:15、16、17 都是 null 字符,应该是可以丢弃的吧。

02 表示存储格式版本 2(serialize() 的 version 参数目前取值为 2);03 04 03 表示 R 版本 3.4.3。再剩下的 02 03 我就不知道是什么了。

    yihui

    14~17位是00 00 00 00,感觉像是分隔用

    另外试了一下用rawToChar()来解码, 可以确定的是一般的字符串就是用ascii码来serialize,而头文件除了开头的58 0a是ascii之外,其他位置的编码应该不是ascii。

    > serialize('aaaa',NULL)
     [1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 04 00
    [26] 09 00 00 00 04 61 61 61 61
    
    
    > rawToChar(x = serialize('aaaa',NULL),multiple = TRUE)
     [1] "X"    "\n"   ""     ""     ""     "\002" ""     "\003" "\004" "\003"
    [11] ""     "\002" "\003" ""     ""     ""     ""     "\020" ""     ""    
    [21] ""     "\001" ""     "\004" ""     "\t"   ""     ""     ""     "\004"
    [31] "a"    "a"    "a"    "a" 

    [另外研究serialize的代码也钻的太底层了吧……

      5 天 后

      tctcab 研究SerDe 其实很有意义,因为 production环境 都会计较这些性能,通常是用一些二进制流来处理,这时候就会涉及到 SerDe

      digest 里面的 murmurhash有点弱,只支持了 32位, 不支持64位甚至更高的 hash。

      4 年 后