【问题标题】:What's the best way to send an object over a network in Python?在 Python 中通过网络发送对象的最佳方式是什么?
【发布时间】:2011-03-12 14:42:26
【问题描述】:

我需要通过网络发送对象。我将使用 Twisted,我刚刚开始查看它的文档。

据我所知,python 实现套接字的唯一方法是通过文本。那么如何使用字符串发送对象呢?泡菜?还是有更好的?

【问题讨论】:

  • 实际上,你最好使用管子。 1998 年,管道被管子取代。
  • 是的。事实上,其中有一系列。

标签: python networking twisted


【解决方案1】:

Python 端点之间提供的最通用的序列化是 pickle 格式(在 Python 2.any 中,请务必使用 cPickle 模块和 -1 aka pickle.HIGHEST_PROTOCOL 协议;如果您需要互操作性在 Python 2.any 和 Python 3.any 之间需要更多关注)。对于特别简单的对象,marshal 模块有时可以更快更紧凑。对于与非 Python 端点的互操作,json 可能是最好的(或者您可以使用xml 来定义或采用其他现有的序列化格式),但这些格式和解析可能会更庞大且更慢。

据我所知,python的唯一途径 实现套接字是通过文本。

不,欢迎所有字节字符串!-) 您可能会因为在 Python 2 中“普通字符串”实际上是字节字符串(“文本”是 unicode 类型)而感到困惑; Python 3 设置正确,并为“普通字符串”使用 Unicode,为字节字符串使用特定的字节字符串类型。

字节字符串是任何语言根据某种协议或其他协议执行任何形式的序列化和反序列化的一般方式——这样的字节流或 blob 可以进入网络、数据库、普通文件等,等等,当然。

Twisted 提供了自己的序列化格式,作为twisted.spread 的一部分——它主要用于 Perspective Broker (PB),但如果您出于某些特殊原因不想使用 PB,则可以将其重新用于自己的目的。序列化部分的文档twisted.spread.jellyhere,并且很好地总结了格式的目标...:

基于 S 表达式的持久性 python 对象。

它做的事情很像 泡菜;然而,泡菜的主要目标 似乎是效率(无论是在空间 和时间);果冻的主要目标是 安全性、人类可读性和 可移植到其他环境。

如果您更关心安全性、可读性和便携性,而不是速度和紧凑性,那么 Jelly 确实可以为您服务。

【讨论】:

  • 只有 2 美分,除了泡菜(cpickle) 的麻烦,我什么都没有。由于它的脆弱性,我不会将它用作通用对象序列化程序。我发现无论是编组基本数据类型还是使用为序列化构建的 dao 目的都取得了最大的成功。
猜你喜欢
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多