V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chaleaoch
V2EX  ›  Python

Python 序列化问题请教

  •  
  •   chaleaoch · 2021-09-22 09:28:39 +08:00 · 3386 次点击
    这是一个创建于 1188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    flask 和 django 默认的 session 序列化使用的是 pickle, 现在因为某些原因,需要换成和 go 兼容的.
    golang 的 pickle 包 都不是很稳定且长久未更新. 所以想换成兼容的, protobuf 太重了.
    想用 json 但是大家都知道默认的 json encode 不支持 datetime 序列化.


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


    谢谢啦.
    20 条回复    2021-09-23 17:23:29 +08:00
    fgwmlhdkkkw
        1
    fgwmlhdkkkw  
       2021-09-22 09:31:46 +08:00
    msgpack
    chaleaoch
        2
    chaleaoch  
    OP
       2021-09-22 09:42:06 +08:00
    @fgwmlhdkkkw 还是不支持 datetime ...
    abersheeran
        4
    abersheeran  
       2021-09-22 09:50:30 +08:00
    自己定义 datetime 的序列化与反序列化方式不就好了。golang 里同理。

    不过我建议你先把 golang 的写好,因为 python json 自定义起来比 golang 方便多了,python 能轻松解析的 json,golang 可不一定。
    ysc3839
        5
    ysc3839  
       2021-09-22 09:54:27 +08:00
    @chaleaoch msgpack 自己就有 timestamp 类型的扩展支持。就算不支持也可以自己实现,msgpack 有 ext 类型。
    arthurire
        6
    arthurire  
       2021-09-22 09:55:34 +08:00
    你可以直接转换成 Unix epoch 然后再序列化吧?
    ipwx
        7
    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
        8
    2i2Re2PLMaDnghL  
       2021-09-22 10:24:02 +08:00
    这个 Python 没有 trait 就是逊啦
    不然直接 impl datetime for JsonSerializable 不就行了
    题外话,其实我感觉你直接 pydantic 就行。

    确实推荐按类型动态性由弱到强地写。
    python dict 是 dict[Hashable, Any] ,比 JSON 还动态。
    chaleaoch
        9
    chaleaoch  
    OP
       2021-09-22 10:28:26 +08:00
    @fgwmlhdkkkw 我知道 我可以自定义 encoder 实现. 这没问题. 我的问题是 json 除了不支持 datetime 是否还有其他不支持的格式.
    chaleaoch
        10
    chaleaoch  
    OP
       2021-09-22 10:31:01 +08:00
    @2i2Re2PLMaDnghL 问题是 session 已经存在了 , 现在是在一个既存的应用上改. 如果新项目方案就很多了.
    zeroxia
        11
    zeroxia  
       2021-09-22 10:38:34 +08:00
    flatbuffers?
    misaka19000
        12
    misaka19000  
       2021-09-22 12:23:51 +08:00
    ES 用的就是 JSON,没什么问题的
    2i2Re2PLMaDnghL
        13
    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
        14
    Nich0la5  
       2021-09-22 17:05:59 +08:00
    Protobuf
    chaleaoch
        15
    chaleaoch  
    OP
       2021-09-22 17:25:28 +08:00
    @2i2Re2PLMaDnghL 谢谢. 你说的没错, 要这么干又要照顾应用层了.
    最后的方案是我们把这个功能砍了. - - 后面再说.
    neoblackcap
        16
    neoblackcap  
       2021-09-22 19:04:01 +08:00
    只是让 datetime 类型支持 json 格式序列化的话,直接实现 encoder/decoder 就好了,不管是 go 还是 python 的标准库都可以支持这个操作。
    Hstar
        17
    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
        18
    tmackan  
       2021-09-22 19:19:03 +08:00
    json
    zepc007
        19
    zepc007  
       2021-09-23 09:36:16 +08:00
    @2i2Re2PLMaDnghL +1,pydantic 好评
    O5oz6z3
        20
    O5oz6z3  
       2021-09-23 17:23:29 +08:00   ❤️ 1
    偶然看到 https://hynek .me/articles/serialization/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:37 · PVG 02:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.