Python中的安全和通用序列化

Python中的安全和通用序列化,python,json,python-3.x,serialization,Python,Json,Python 3.x,Serialization,我想将Python中的简单对象(反)序列化为人类可读的(例如JSON)格式。数据可能来自不受信任的来源。我非常喜欢Rust library serde的工作方式: #[派生(序列化、反序列化、调试)] 结构点{ x:i32, y:i32, } fn main(){ 设点=点{x:1,y:2}; //将点转换为JSON字符串。 让serialized=serde_json::to_string(&point).unwrap(); //打印序列化={“x”:1,“y”:2} println!(“序列

我想将Python中的简单对象(反)序列化为人类可读的(例如JSON)格式。数据可能来自不受信任的来源。我非常喜欢Rust library serde的工作方式:

#[派生(序列化、反序列化、调试)]
结构点{
x:i32,
y:i32,
}
fn main(){
设点=点{x:1,y:2};
//将点转换为JSON字符串。
让serialized=serde_json::to_string(&point).unwrap();
//打印序列化={“x”:1,“y”:2}
println!(“序列化={}”,序列化);
//将JSON字符串转换回一个点。
让反序列化:Point=serde_json::from_str(&序列化).unwrap();
//打印反序列化=点{x:1,y:2}
println!(“反序列化={:?}”,反序列化);
}
我希望在Python中实现类似的功能。由于Python不是静态类型,因此我希望其语法如下:

deserialized = library.loads(data_str, ClassName)
其中,
ClassName
是预期的类

  • jsonpickle
    坏了,坏了,坏了。它绝对不进行清理,使用它会导致任意代码执行
  • 有序列化库:
    lima
    marshmallow
    kim
    ,但所有这些库都需要手动定义序列化方案。事实上,它会导致代码重复,这是不好的
  • 在Python中,有什么东西可以用于简单、通用但安全的序列化吗

    编辑:以前隐含的其他需求

  • 处理嵌套序列化(serde可以做到:)
  • 处理内置类型,即能够序列化和反序列化内置
    json
    模块可以序列化和反序列化的所有内容,而无需对内置类型进行特殊处理

  • 由于Python不需要类型注释,任何这样的库都需要

  • 使用它自己的类
  • 利用类型注释 后者将是一个完美的解决方案,但我还没有发现任何库能够做到这一点

    不过,我发现了一个模块,它只需要定义一个类作为模型:

    用法示例:

    import jsonobject
    
    
    class Node(jsonobject.JsonObject):
        id = jsonobject.IntegerProperty(required=True)
        name = jsonobject.StringProperty(required=True)
    
    
    class Transaction(jsonobject.JsonObject):
        provider = jsonobject.ObjectProperty(Node)
        requestor = jsonobject.ObjectProperty(Node)
    
    
    req = Node(id=42, name="REQ")
    prov = Node(id=24, name="PROV")
    
    tx = Transaction(provider=prov, requestor=req)
    js = tx.to_json()
    tx2 = Transaction(js)
    print(tx)
    print(tx2)
    

    对于Python,我将首先检查输入的大小。唯一的安全风险是运行json。load()是通过发送一个巨大的文件来执行DOS


    解析JSON后,考虑运行一个模式验证器,例如. 请举例说明如何使用内置类型。如何从json对象到列表?例如,
    反序列化(“[1,3]”,list[int])
    ?基本上,如果给定了一个类型,就可以反序列化内置的
    json
    模块可以反序列化的任何内容。