Python 序列化问题请教

2021-09-22 09:28:39 +08:00
 chaleaoch
flask 和 django 默认的 session 序列化使用的是 pickle, 现在因为某些原因,需要换成和 go 兼容的.
golang 的 pickle 包 都不是很稳定且长久未更新. 所以想换成兼容的, protobuf 太重了.
想用 json 但是大家都知道默认的 json encode 不支持 datetime 序列化.


所以想问一下大家除了 datetime 还有其他 python 对象不支持序列化吗? 我想自定义一个 encoder 或者有没有开源的解决方案?
同时需要兼容 golang.


谢谢啦.
3384 次点击
所在节点    Python
20 条回复
fgwmlhdkkkw
2021-09-22 09:31:46 +08:00
msgpack
chaleaoch
2021-09-22 09:42:06 +08:00
@fgwmlhdkkkw 还是不支持 datetime ...
fgwmlhdkkkw
2021-09-22 09:48:50 +08:00
abersheeran
2021-09-22 09:50:30 +08:00
自己定义 datetime 的序列化与反序列化方式不就好了。golang 里同理。

不过我建议你先把 golang 的写好,因为 python json 自定义起来比 golang 方便多了,python 能轻松解析的 json,golang 可不一定。
ysc3839
2021-09-22 09:54:27 +08:00
@chaleaoch msgpack 自己就有 timestamp 类型的扩展支持。就算不支持也可以自己实现,msgpack 有 ext 类型。
arthurire
2021-09-22 09:55:34 +08:00
你可以直接转换成 Unix epoch 然后再序列化吧?
ipwx
2021-09-22 10:18:00 +08:00
1. json 比较通用,所以大概还是用 json 更好。
2. 你可以扩展标准的 json encoder 。第三方 json encoder 比如 ujson 好像也支持。
3. 或者其实比如我,一般都直接把 datetime 转换成 timestamp ( python timestamp * 1000 变成毫秒)然后丢给 C++ 的。C++ 也是存 timestamp 丢给 python 。
2i2Re2PLMaDnghL
2021-09-22 10:24:02 +08:00
这个 Python 没有 trait 就是逊啦
不然直接 impl datetime for JsonSerializable 不就行了
题外话,其实我感觉你直接 pydantic 就行。

确实推荐按类型动态性由弱到强地写。
python dict 是 dict[Hashable, Any] ,比 JSON 还动态。
chaleaoch
2021-09-22 10:28:26 +08:00
@fgwmlhdkkkw 我知道 我可以自定义 encoder 实现. 这没问题. 我的问题是 json 除了不支持 datetime 是否还有其他不支持的格式.
chaleaoch
2021-09-22 10:31:01 +08:00
@2i2Re2PLMaDnghL 问题是 session 已经存在了 , 现在是在一个既存的应用上改. 如果新项目方案就很多了.
zeroxia
2021-09-22 10:38:34 +08:00
flatbuffers?
misaka19000
2021-09-22 12:23:51 +08:00
ES 用的就是 JSON,没什么问题的
2i2Re2PLMaDnghL
2021-09-22 16:05:20 +08:00
@chaleaoch json 就 7 种内容不是吗?
object array string number true false null
对应
dict list str int/float True False None
你可以估计大部分是不支持的
除非你写成 pydantic,能打通 object <=> dict 的界面,类比 ORM 我叫它 OJM 吧
Nich0la5
2021-09-22 17:05:59 +08:00
Protobuf
chaleaoch
2021-09-22 17:25:28 +08:00
@2i2Re2PLMaDnghL 谢谢. 你说的没错, 要这么干又要照顾应用层了.
最后的方案是我们把这个功能砍了. - - 后面再说.
neoblackcap
2021-09-22 19:04:01 +08:00
只是让 datetime 类型支持 json 格式序列化的话,直接实现 encoder/decoder 就好了,不管是 go 还是 python 的标准库都可以支持这个操作。
Hstar
2021-09-22 19:12:22 +08:00
你猜你想问 Django 默认的 json 序列化器额外支持了哪些类型,可以直接看 DjangoJSONEncoder 的源码 https://github.com/django/django/blob/ca9872905559026af82000e46cde6f7dedc897b6/django/core/serializers/json.py#L77
可见除了 datetime 的几个类型外,还做了 UUID 、decial 和 django.Promise 的 json 序列化支持
tmackan
2021-09-22 19:19:03 +08:00
json
zepc007
2021-09-23 09:36:16 +08:00
@2i2Re2PLMaDnghL +1,pydantic 好评
O5oz6z3
2021-09-23 17:23:29 +08:00
偶然看到 https://hynek .me/articles/serialization/

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

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

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

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

© 2021 V2EX