AMF3 specification 定义了所谓的“参考表”的使用(参见本规范的第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应用程序和服务器之间有非标准协议)
谢谢!
答案 0 :(得分:3)
我认为不同之处在于,在第一个示例中,您正在编写两个字符串文字。在第二个示例中,您正在编写一个数组(或Adobe的规范中的复杂对象),该数组具有对两个字符串的引用。因此,如果您从对象或数组引用字符串,它将在引用表中写入它。
这不一定是强制执行它的方法,但是内置到flash中的AMF序列化程序以这种方式序列化对象似乎是合乎逻辑的,因此它可能是获得所需行为的可靠方法(引用表字符串)。
我希望这对你有所帮助!
答案 1 :(得分:1)
根据AMF3规范的最后一句(AMF 3.0 Spec at Adobe.com):
另请注意,ByteArray为每个readObject和writeObject调用使用一组新的隐式引用表来表示对象,对象特征和字符串。
看来,ByteArray.writeObject的意图是创建一个可以基于每个对象存储或恢复的序列化。
NetConnection对象的行为类似于您所希望的行为。
更新字符串引用表时,不要将空字符串添加到引用表中。
维护对象引用表时,您可以按如下方式实现防御性编程:对象引用表是递归构造的,有时包含尚未完全知道特征的对象。如果未提前分配表索引,则应用程序之间的编号将不一致。 AMF3解码器不应该使用部分构造的对象的特征 - 这样的输入应该被标记为错误。
字符串引用表在编码器中通过'标记'内存中的字符串对象来实现它们被序列化。使用相同内容(匹配字符串)编码两个不同的字符串对象似乎不会使用一个引用另一个字符串的字符串进行编码。将输出两个字符串,并且不会使用逐个引用的字符串。
您的原始问题可能有解决方案。如果你有多个对象都属于同一个类,并且你想将这些对象存储在一个存储中,我建议如下:创建一个“父对象”,引用你想要存储的所有对象。然后使用ByteArray.writeObject来持久化该父对象。 AMF将对所有引用的对象进行编码,并以有效的方式表示重复对象类的特征。
答案 2 :(得分:0)
查看官方AMF3规范的最后一页,你会发现ByteArray几乎毫无价值。您必须编写自己的AMF3串行器/解串器。