5

AMF3 规范定义了所谓的“参考表”的使用(参见本规范的第 2.2 节)。

我在我用 Erlang 开发的 AMF3 编码器/解码器中实现了这种行为,但是我对 Flash API 不是很有经验,我几乎找不到在将对象序列化为 AMF3 时如何轻松地强制 Flash 使用这些引用表;例如,如果我使用 ByteArray,它似乎只是重复完整的对象编码

 var ba:ByteArray = new ByteArray();
 ba.writeObject("some string1");
 ba.writeObject("some string1");
 # =>
 # <<6,25,115,111,109,101,32,115,116,114,105,110,103,49,
 #   6,25,115,111,109,101,32,115,116,114,105,110,103,49>>

(这显然是重复)。

但是,如果这两个字符串在一个单独的 writeObject 调用中,它似乎确实使用了引用:

 ba.writeObject(["some string1", "some string1"]);
 # => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>>

Socket 的行为似乎相同。

那么,我可以在 Flash 代码中使用引用表吗?(假设我可能在 Flash 应用程序和服务器之间有一个非标准协议)

谢谢!

4

3 回答 3

3

我认为不同之处在于,在第一个示例中,您正在编写两个字符串文字。在第二个示例中,您正在编写一个引用两个字符串的数组(或 Adob​​e 规范中的复杂对象)。因此,如果您从对象或数组中引用字符串,它会将其写入引用表中。

这不一定是强制执行它的方法,但内置于闪存中的 AMF 序列化程序以这种方式序列化对象似乎是合乎逻辑的,因此它可能是获得所需行为的可靠方法(参考表字符串)。

我希望这对你有帮助!

于 2009-03-15T17:06:18.053 回答
1

根据 AMF3 规范的最后一句话(Adobe.com 上的 AMF 3.0 Spec):

另请注意,ByteArray 为每个 readObject 和 writeObject 调用使用一组新的对象、对象特征和字符串的隐式引用表。

看来 ByteArray.writeObject 的目的是创建一个可以基于每个对象存储或恢复的序列化。

NetConnection 对象的行为与您所希望的相似。

更新字符串引用表时,不要将空字符串添加到引用表中,这一点很重要。

在维护对象引用表时,您可以按如下方式实现防御性编程:对象引用表是递归构造的,有时包含特征尚未完全了解的对象。如果没有预先分配表索引,则应用程序之间的编号将不一致。AMF3 解码器不应使用部分构造对象的特征——此类输入应标记为错误。

字符串引用表是在编码器处通过“标记”内存中的字符串对象在序列化时实现的。对具有相同内容(匹配字符串)的两个不同字符串对象进行编码似乎没有使用一个字符串引用另一个字符串进行编码。两个字符串都将被输出,并且不会使用按引用的字符串。

您的原始问题可能有解决方案。如果您有许多属于同一个类的对象,并且您希望将这些对象全部存储在一个存储中,我建议如下: 创建一个“父对象”,其中包含对您打算存储的所有对象的引用。然后使用 ByteArray.writeObject 来持久化该父对象。AMF 将对所有引用的对象进行编码,并以有效的方式表示重复对象类的特征。

于 2009-10-12T22:52:23.480 回答
0

查看官方 AMF3 规范的最后一页,您会发现 ByteArray 几乎一文不值。您必须编写自己的 AMF3 序列化器/解串器。

于 2009-08-15T05:01:48.857 回答