V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Junjunya
V2EX  ›  Go 编程语言

有啥好用的 phpserialize 函数么

  •  
  •   Junjunya · 2019-03-21 10:43:18 +08:00 · 1865 次点击
    这是一个创建于 2067 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2022-07-18 03:23:19 +08:00
    GTim
        1
    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
        2
    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
        3
    Junjunya  
    OP
       2019-03-21 11:31:22 +08:00
    @GTim 感谢回复。

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

    即使你自己实现,也是要先实现 map[string]interface{} 的。然后再判断是否数组
    Junjunya
        5
    Junjunya  
    OP
       2019-03-21 11:48:18 +08:00
    @GTim 已经实现了 map[string]interface{}了, 项目比较紧,暂时这样可以满足需求,就没进一步改。
    稍微有时间之后继续改改。 感谢大佬,我也是翻了翻 github 没找到合适的
    Trim21
        6
    Trim21  
       2022-07-18 03:23:19 +08:00 via Android
    我最近写了一个,如果你知道序列化之前是数组还是 map 的话,那用法跟 json 包一样… https://github.com/Trim21/go-phpserialize
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1121 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:01 · PVG 03:01 · LAX 11:01 · JFK 14:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.