使用writeObject / readObject序列化循环对象网络

时间:2011-10-06 22:51:40

标签: flash actionscript-3 flex flash-builder flexbuilder

我即将实施

public function writeExternal( output:IDataOutput ):void {...}
public function readExternal( input:IDataInput ):void {...}

使一组对象可序列化。

虽然我很确定,我已经正确实施了所有内容,readExternal(..)在某一时刻抱怨数据太少而无法阅读:

RangeError: Error #2006: The supplied index is out of bounds.
    at flash.filesystem::FileStream/readObject()

我想知道,如果我有像

这样的循环对象网络
A = { left -> B, right -> B }
B = { father -> A }

我打电话

writeObject( a )

将Flex序列化孔对象网络和每个对象只有一个?

我这样做了:

  • 声明类似注释:[RemoteClass(alias="model.MyClass")]
  • 实施无参数构造函数
  • 使用implements IExternalizable
  • 声明所有课程

SharedObjectsend()方法保证每次只发送一次对象。

其他信息:

请查看此related question

1 个答案:

答案 0 :(得分:0)

meta [RemoteClass]是一个指令,仅适用于Flex编译器识别为使用Flex框架的项目中使用的类。它基本上等同于调用registerClassAlias(MyClass, "model.MyClass");由于多种原因扩展了这个主题的容量,我建议你改用registerClassAlias。

关于AMF内置编写器,行为如下:如果编写器接收到它需要立即写入的所有对象(如在树中,则为其提供根节点),然后它只会完全写入一次对象,下次出现对该对象的引用时,它将使用该引用。但是,如果你不断地提供它可能已被引用的对象(例如通过连续调用writeExternal),它会将每个对象视为新对象。至少在理论上,它也应该以另一种方式工作。也就是说,如果对象通过引用序列化,一旦它们反序列化,就应该使用引用。这将有助于查看更多代码,特别是writeExternal和readExternal的实现,以提供更好的答案。