5

我有一个用 Adob​​e Flex 3 和 Python 2.5 开发的网络应用程序(部署在 Google App Engine 上)。已在 Python 中创建了一个 RESTful Web 服务,其结果当前为 XML 格式,Flex 正在使用 HttpService 对象读取该格式。

现在的主要目标是压缩 XML,以减少 HttpService send() 方法和结果事件之间的时间。我查阅了 Python 文档并设法使用 zlib.compress() 来压缩 XML 结果。

然后我将 HttpService 结果类型从“xml”设置为“text”,并尝试使用 ByteArrays 将字符串解压缩回 XML。这就是我失败的地方。我正在做这样的事情:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

它在 byteArray.uncompress() 抛出异常并说无法解压缩 byteArray。此外,当我跟踪 byteArray 的长度时,它得到 0。

无法弄清楚我做错了什么。感谢所有帮助。

- 编辑 -

编码:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

事件的类型为 ResultEvent。

错误:

错误:错误 #2058:解压缩数据时出错。

该错误可能是因为 byteArray.bytesAvailable = 0 的值,这意味着 python 生成的原始字节尚未正确写入 byteArray。

——斯里

4

1 回答 1

2

应该怎么byteArray.writeUTF( event.result.toString() );做?zlib.compress() 的结果既不是 unicode 也不是“UTF”(后面没有数字毫无意义!?);它是二进制又名原始字节;您既不应该对其进行解码,也不应该对其进行编码,也不应该对其应用任何其他转换。接收者应该立即解压缩它接收到的原始字节,以便恢复传递给 zlib.compress() 的数据。

更新您有哪些文档来支持byteArray.uncompress()期望真正的zlib流而不是deflate流的概念(即在您剪掉前 2 个字节和最后 4 个字节后的 zlib 流)?

ByteArray的 Flex 3 文档给出了这个例子:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

但没有说明默认值(如果有的话)是什么。如果有默认值,则不会在任何明显的地方记录它,因此使用它是一个非常好的主意

bytes.uncompress(CompressionAlgorithm.ZLIB);

使您的意图显而易见。

并且文档谈论的是一种writeUTFBytes方法,而不是一种writeUTF方法。您确定在您的问题中复制/粘贴了准确的接收方代码吗?

更新 2

感谢您的网址。看起来我得到了“帮助”,而不是真正的文档:=(。有几点:

(1) 是的,有一个明确的inflate()方法。但是 uncompress 确实有一个算法 arg;它可以是 CompressionAlgorithm.ZLIB(默认值)或 CompressionAlgorithm.DEFLATE ...有趣的是,后者仅在 Adob​​e Air 中可用,在 Flash Player 中不可用。至少我们知道 uncompress() 调用看起来没问题,我们可以回到将原始字节传输到线路上并再次传输到 ByteArray 实例中的问题。

(2)更重要的是,两者都有writeUTF(向字节流写入一个UTF-8字符串。首先写入UTF-8字符串的字节长度,为16位整数,后面是代表字符的字节)字符串)和writeUTFBytes(将 UTF-8 字符串写入字节流。类似于 writeUTF() 方法,但 writeUTFBytes() 不会在字符串前面加上 16 位长度的字)。

无论提供 UTF8 编码字节(nil,恕我直言)的优点是什么,您都不希望那里有 2 字节长度的前缀。保证使用 writeUTF() 会导致 uncompress() 失败

上网:在二进制数据上使用 Python 打印似乎不是一个好主意(除非 sys.stdout 已经被允许在原始模式下运行,而您没有在代码中显示)。

同样做 event.result.toString() 得到一个字符串(类似于 Python unicode 对象,是/否?)——用什么然后用 UTF-8 编码它似乎不太可能工作。

鉴于我直到今天才知道 flex 存在,我真的无法有效地帮助你。以下是一些关于自给自足的进一步建议,以防很快没有人知道更多的弹性:

(1) 做一些调试。从一个最小的 XML 文档开始。显示repr(xml_doc)。显示repr(zlib_compress_output)。在您的 flex 脚本(缩减版)中,使用最接近repr()您可以找到的函数/方法来显示:event.resultevent.result.toString()以及writeUTF*(). 确保您了解在 zlib.compress() 之后可能发生的所有事情的影响。仔细阅读文档可能会有所帮助。

(2) 看看如何从 event.result 中获取原始字节。

HTH,约翰

于 2009-12-02T04:47:49.740 回答