在Python中通过网络发送对象的最佳方法是什么?

9 投票
1 回答
6218 浏览
提问于 2025-04-16 00:54

我需要在网络上发送一些对象。我打算使用Twisted这个库,现在刚开始查看它的文档。

据我所知,Python处理网络连接的方式主要是通过文本。那么,我该如何用字符串发送一个对象呢?是用Pickle吗?还是有更好的方法?

1 个回答

19

在Python中,最常用的序列化方式是pickle格式(在Python 2.x中,记得使用cPickle模块,并选择-1pickle.HIGHEST_PROTOCOL协议;如果你需要在Python 2和Python 3之间互通,就要更加小心了)。对于一些特别简单的对象,marshal模块有时会更快、更小巧。要和非Python的系统互通,json可能是最好的选择(或者你可以使用xml来定义或采用其他现有的序列化格式),不过这些格式通常会更大、更慢。

据我所知,Python实现套接字的唯一方式是通过文本。

其实不是,所有的字节字符串都是可以的!你可能会对Python 2中的“普通字符串”感到困惑,因为它实际上是字节字符串(“文本”指的是unicode类型);Python 3则把事情理顺了,使用Unicode作为“普通字符串”,并为字节字符串提供了一个特定的类型。

字节字符串是任何编程语言进行序列化和反序列化的通用方式,这些操作是根据某种协议进行的——这样的字节流或数据块可以发送到网络、数据库、普通文件等等。

Twisted提供了自己的序列化格式,作为twisted.spread的一部分——它主要用于Perspective Broker(PB),但如果你有特殊原因不想使用PB,也可以将其用于其他目的。关于序列化部分twisted.spread.jelly的文档在这里,它很好地总结了这个格式的目标……:

基于S表达式的Python对象持久化。

它的功能和Pickle很相似;不过,pickle的主要目标似乎是效率(在空间和时间上);而jelly的主要目标是安全性、可读性和在其他环境中的可移植性。

如果你更关心安全性、可读性和可移植性,而不是速度和紧凑性,那么jelly可能会很适合你。

撰写回答