有啥好用的 phpserialize 函数么

2019-03-21 10:43:18 +08:00
 Junjunya

公司项目都是以 PHP 为主,最近搞几个 go 项目需要 rpc 调取以前 PHP 写的服务。
但是内部的 PHP 服务都是通过 PHP 的 serialize()函数序列化的。所以就想找找 go 有没有 unserialize()的函数。

github 找了几个包, 大部分都是把 PHP 的 array 解析成了 map ,并且类型是 map[interface{}]interface{}
然后就遇到下一个问题 没法转 json。
虽然暂时修改了下包 把返回值变成了 map[string]interface{} 但是还一个问题就是 没法正确的区分是不是数组。

所以就来请教下万能的 V2er,go 有没有好用的 phpserialize 函数, 可以准确区分 array 和 map 的那种

1795 次点击
所在节点    Go 编程语言
6 条回复
GTim
2019-03-21 11:18:22 +08:00
目前没发现,提供你一个 hook 方法,生成了 map[string]interface{} 后,判断 key 是不是连续的整数字符串即可

PHP serialize 数组

[1,2,3,4,6]

序列化后生成的数据为

a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:6;}


只要是数组,下标一定从 0 开始,结尾一定是长度 -1,而且连续
GTim
2019-03-21 11:25:42 +08:00
@GTim 接上

为什么 其它语言实现的几乎都是 Map,是因为 serialize 序列化后的结果,数组和哈希表是没啥区别的,唯一的区别就是键的类型是否有 i 或 s.

1. 只要出现 s,那么必须是 map
2. 全部都是 i , 如果最后的每个键都自增,那么就是 array
3. 否则,还是 map

<?php

$person = [1,2,3,4,6];
echo serialize($person);
echo "\n\n";

$person = [1, 10 => 2,3,4,6];
echo serialize($person);
echo "\n\n";

$person = [
'name' => 'yufei',
'age' => 28,
'address' => 'dd'
];

echo serialize($person);
echo "\n\n";


$person = [
'88',
'name' => 'yufei',
'age' => 28,
'address' => 'dd',
'99'
];

echo serialize($person);
echo "\n\n";


$person = [[
'name' => 'yufei',
'age' => 28,
'address' => 'dd'
],
[
'name' => 'yufei',
'age' => 28,
'address' => 'dd'
]
];

echo serialize($person);
echo "\n\n";


结果如下


a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:6;}

a:5:{i:0;i:1;i:10;i:2;i:11;i:3;i:12;i:4;i:13;i:6;}

a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";}

a:5:{i:0;s:2:"88";s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";i:1;s:2:"99";}

a:2:{i:0;a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";}i:1;a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";}}
Junjunya
2019-03-21 11:31:22 +08:00
@GTim 感谢回复。

作为一个专业的 VC 党,打算先来请教下是否已经有了合适的包, 如果有的话 就不自己写一遍了。
实在没有的话,就只能自己写一个了
GTim
2019-03-21 11:35:44 +08:00
@Junjunya 我看了下 github 上的,没有你要的,所以才来写文告知你详情

即使你自己实现,也是要先实现 map[string]interface{} 的。然后再判断是否数组
Junjunya
2019-03-21 11:48:18 +08:00
@GTim 已经实现了 map[string]interface{}了, 项目比较紧,暂时这样可以满足需求,就没进一步改。
稍微有时间之后继续改改。 感谢大佬,我也是翻了翻 github 没找到合适的
Trim21
2022-07-18 03:23:19 +08:00
我最近写了一个,如果你知道序列化之前是数组还是 map 的话,那用法跟 json 包一样… https://github.com/Trim21/go-phpserialize

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/546894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX