Golang Go语言中 有啥好用的 phpserialize 函数么的等价物

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言中 有啥好用的 phpserialize 函数么的等价物

公司项目都是以 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 的那种


更多关于Golang Go语言中 有啥好用的 phpserialize 函数么的等价物的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

目前没发现,提供你一个 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,而且连续

更多关于Golang Go语言中 有啥好用的 phpserialize 函数么的等价物的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


接上

为什么 其它语言实现的几乎都是 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”;}}

感谢回复。

作为一个专业的 VC 党,打算先来请教下是否已经有了合适的包, 如果有的话 就不自己写一遍了。
实在没有的话,就只能自己写一个了

我看了下 github 上的,没有你要的,所以才来写文告知你详情

即使你自己实现,也是要先实现 map[string]interface{} 的。然后再判断是否数组

已经实现了 map[string]interface{}了, 项目比较紧,暂时这样可以满足需求,就没进一步改。
稍微有时间之后继续改改。 感谢大佬,我也是翻了翻 github 没找到合适的

我最近写了一个,如果你知道序列化之前是数组还是 map 的话,那用法跟 json 包一样… https://github.com/Trim21/go-phpserialize

在Go语言中,并没有直接等同于PHP中的phpserialize函数的内置库,但你可以通过第三方库或自定义代码来实现类似的功能。phpserialize通常用于将PHP数组或对象序列化为字符串,以便存储或传输。

在Go中,你可以使用以下方法来模拟这一功能:

  1. 使用JSON序列化:Go的encoding/json包提供了强大的JSON序列化能力。如果你的数据结构在PHP和Go之间可以统一为JSON格式,那么这是一个很好的选择。你可以将Go的结构体序列化为JSON字符串,然后在PHP端反序列化。

  2. 使用第三方库:有些第三方库提供了类似phpserialize的功能,例如github.com/yvasiyarov/phpserialize。这个库实现了PHP序列化格式的读写,但请注意,使用第三方库时,务必查看其文档和社区支持情况,以确保其稳定性和安全性。

  3. 自定义序列化函数:如果你对数据结构有完全的控制权,可以编写自定义的序列化函数,将Go的结构体转换为自定义的字符串格式。这种方法灵活性高,但需要更多的编码工作。

总的来说,如果你需要在Go和PHP之间传输数据,使用JSON是一个简单且广泛支持的选择。如果出于某种原因必须使用PHP序列化格式,可以考虑使用第三方库或编写自定义代码。

回到顶部