Skip to content

录制流量的序列化

Mingliang Tan edited this page Feb 15, 2019 · 2 revisions

序列化

直接用 json.Marshal 得到的 []byte 是经过 base64 编码的。这样在 elasticsearch 里存储的时候就无法全文检索了(至少原生不支持 base64 解码再分词)。转成 string 在 json.Marshal 遇到的问题是 go 的标准库里对 string 的 utf8 合法性做了校验(https://github.com/golang/go/blob/master/src/encoding/json/encode.go#L918 )。

解决办法是重写了 string 的 json 序列化代码。对于不合法的 utf8 字符转码成了 \x00(注意有两个 \,因为这个是json转义了的。\x本身并不是被 json 支持) 这样的格式。如果原有的输入里就有 \ 转义的,把 \ 也做了 \x 的转义。

php在 json_decode 之后还需要 stripcslashes(把 \x 解开) 才能取到真正原始的 []byte

Clone this wiki locally