1

如何在不使用 Flash 的情况下直接读写Adob​​e Flash Media Server 远程共享对象(FSO 文件) ?

最好,我想使用 python、php 或 java,但我不介意使用不同的编码语言。我正在寻找文件结构,所以我可以像这个读写文件的应用程序一样读写sol文件。

我需要这个的原因是能够修复在一台机器上创建的文件,这样它们就可以为我正在设置的新机器提供正确的设置。

谢谢!

编辑

我可以使用记事本读取某些文件内容,但某些字符显示不正确,例如,请查看http://pastebin.com/AWdJ2ZcR

十六进制编辑器的附加输出: 在此处输入图像描述

我试过使用pyamf没有运气:

from pyamf import sol
lso = sol.load(file)

我收到以下错误:

raise pyamf.DecodeError('Unknown SOL version in header')
pyamf.DecodeError: Unknown SOL version in header
4

1 回答 1

3

这些文件使用AMF格式,实际上读写起来相当简单。Python 有pyamf库。Java 有一堆,大概有 3 或 4 个,但最常用的两个是 Granite Data Services 的一部分,另一个是 Adob​​e 以前开发的 Blaze Data Services。PHP 也有几个实现,AMFPHP 历史上是第一个,然后它被分叉,主要的开发分支并入 Zend Framework,但是 AMFPHP 项目本身仍然存在并且正在开发中,但是速度很慢。

然而,有些事情你必须知道:

  1. AMF 不一定是自定义的。这意味着其中有一个用于发送任意有效负载的选项,实际上,有几个这样的选项,并不真正相关。

    • 有一种标签类型将以下有效负载描述为“自定义”,即它只记录要读取的字节长度,读者可能理解也可能不理解。这对应于IExternalizable在 AS3 中实现。

    • 有一个从序列化中省略字段的选项,在这种情况下,在 Flash 中创建的对象实例将不同于您从文件中解析的实例。这对应于[Transient]元数据的使用。

    • 任何人都可以选择使用 AMF 作为包装器,同时以不同的格式进行实际的序列化,并且只使用与ByteArray类型相对应的标签。在这种情况下,它对你会有一点用处。

  2. AMF 3.0 具有“扩展”,有趣的是,并非所有使用该格式的用户都会有意使用它们,有时会偶然发现它们。播放器中的实现至少有特殊的标签类型VectorDictionary类,但这些不是格式规范的一部分——大多数读者在遇到这些标签时并不理解它们。

  3. 由于在 Flex 框架中的普遍使用,某些不属于规范的类在历史上一直保留在读者实现中。这些将是ArrayCollectionRemoteMessage以及其他一些。ArrayCollection尤其重要,因为它与 基本相同Array,但它是用“自定义”序列化标签发送的。

  4. 了解 ECMAScript 数组的性质和行为也很重要——它们在解码时可能是服务器故障的来源。ECMAScript 数组是稀疏的,这意味着它们不一定包含 0 和最大索引之间的所有索引,它们是一个数组(从 0 开始的第一个连续索引块)的混合,其余的被编码为哈希表整数键。因此,您可能会序列化一个长度为 2^31 的数组,但在将此数组解释为实际数组时无法在服务器端分配这么多内存。

于 2012-08-02T17:27:36.227 回答