同福

Python实现PHP语言的序列化和反序列化功能【20210625】

介绍

介绍

福哥在用Python去读PHP语言开发的项目的数据库的时候,发现一些字段里存储的居然是经过PHP的serialize函数序列化过的数据,这个要解开它通过json库是不行的了,怎么办呢?

原来Python专门有个库用来模拟PHP语言的serialize和unserialize的功能,它就是phpserialize库。

安装

phpserialize库可以直接通过pip进行安装。

pip3 install phpserialize

使用

序列化

使用phpserialize库序列化一个结构转化为一个字符串用到的是dumps方法,用法和json库类似,区别是编码参数不是encoding是charset。

user = {
    'id': 35,
    'name': "福哥",
    'abilities': [
        "PHP",
        "Java",
        "Python",
        "JavaScript",
        "C/C++",
        "Asp.net"
    ]
}

print("原始数据:")
print(user)

print("序列化数据:")
userSN = phpserialize.dumps(user, charset="utf-8")
print(userSN)

home/topic/2021/0626/18/a8da64e061f95106abbef7804c9f7e45.png

可以看到序列化的结果和PHP的serialize基本一致。因为福哥设置的编码的UTF-8的,所以“福哥”占用了6个字符。

反序列化

使用phpserialize库反序列化一个序列化字符串得到原始数据结构用的是loads方法,用法和json库基本一样,同样编码参数也是charset而不是我们想象的encoding。

userSN = b"a:3:{s:2:\"id\";i:35;s:4:\"name\";s:6:\"\xe7\xa6\x8f\xe5\x93\xa5\";s:9:\"abilities\";a:6:{i:0;s:3:\"PHP\";i:1;s:4:\"Java\";i:2;s:6:\"Python\";i:3;s:10:\"JavaScript\";i:4;s:5:\"C/C++\";i:5;s:7:\"Asp.net\";}}"

print("序列化数据:")
print(userSN)

print("原始数据:")
user = phpserialize.loads(userSN, charset="utf-8")
print(user)

home/topic/2021/0626/18/a5dbfd318c01a40433f6ca7f28ba45e8.png

反序列化的时候最好也加上编码参数,避免以默认编码反序列化出现错误的情况。

总结

福哥今天带着童鞋们学习了Python的phpserialize库的使用方法,通过phpserialize库可以让Python语言拥有解析PHP的序列化数据的能力。