无法在AS3中的子类中序列化向量

时间:2011-05-11 02:16:19

标签: actionscript-3 serialization amf

嘿那里!我正在尝试在AS3中序列化数据,但遇到了令人沮丧的问题。最初我遇到“myObjClass”无法转换的问题,但在我发现“registerClassAlias”之后,我让事情变得很好。

一段时间后,我向myObjClass添加了向量。我之前遇到了Vector Strings的麻烦,正如在此报道的那样:

https://bugs.adobe.com/jira/browse/FP-6693

所以我知道解决方法是包括:

registerClassAlias("String", String);

我只是不确定如何在向量中注册子向量的别名(以及其他变量)。这是我的代码:

var newObj:myObjClass = new myObjClass();
newObj.mySubXML = new Vector.<XML>();
newObj.mySubString = new Vector.<String>();

var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
myObj.push(newObj);

registerClassAlias("String", String); // Problem #1
registerClassAlias("XML", XML);       // Problem #1
registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class); // Problem #2
// registerClassAlias("myObjClass", myObjClass); // This and the above are interchangable (same errors)
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myObj);
bytes.position = 0;
myObj = bytes.readObject();

问题#1:当我的编译中包含这两行时,最后一行(bytes.readObject())失败并显示错误:

Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@42edb21 to __AS3__.vec.Vector.<myObjClass>.

这真的很奇怪。就好像前两个registerClassAlias正在撤消第三个。

问题#2:如果我注释掉两个“第一个问题”行(string / xml classalias注册),它将myObj转换为myObjClass就好了;不会抛出内部错误,也不会停止应用程序。但是,它无法转换内部字符串和XML向量,此错误出现在应用程序输出中(不停止):

TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc11 to __AS3__.vec.Vector.<XML>.
TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc41 to __AS3__.vec.Vector.<String>.

所以我的问题是,我如何注册类别:

  • 矢量。(myObjClass)
  • 一个字符串向量作为Vector的属性。(myObjClass)
  • XML的向量,作为Vector的属性。(myObjClass)

所有这些都在同一时间?

4 个答案:

答案 0 :(得分:6)

看起来像搬家:

registerClassAlias("XML", XML);
registerClassAlias("String", String);

直接进入myObjClass,同时保留:

registerClassAlias("myObjClass", myObjClass);

在序列化类中。我不确定为什么在序列化类中将三者一起存储不起作用 - 如果我改变了代码的顺序就会产生奇怪的错误,所以问题可能只是特定机器上的一些小问题。

答案 1 :(得分:4)

当你想使用复杂的矢量内容时,你必须注册你的每个子类(对你Vector。[String]),如下所示:

    package
{
    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import flash.utils.ByteArray;

    public class StackOverFlow extends Sprite
    {
        public function StackOverFlow()
        {
            var newObj:myObjClass = new myObjClass();
            newObj.mySubXML = new Vector.<XML>();
            newObj.mySubString = new Vector.<String>();

            var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
            myObj.push(newObj);

            registerClassAlias("String", String);
            registerClassAlias("XML", XML);
            registerClassAlias("myObjClass", myObjClass);
            registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class);
            var bytes:ByteArray = new ByteArray();
            bytes.writeObject(myObj);
            bytes.position = 0;
            myObj = bytes.readObject();
        }
    }
}

internal class myObjClass{
    public var mySubXML : Vector.<XML>;
    public var mySubString : Vector.<String>;
}

答案 2 :(得分:2)

测试代码Andy需要注册您创建的类,因此bytes.readObject()返回带有自定义类的向量 - 在本例中为myObjClass类。所以如果你添加这行代码:

registerClassAlias("myObjClass", myObjClass);

因此,如果您将代码更改为这样,那么您应该返回该对象,并将其所有数据正确序列化(我做了一个简单的测试,它似乎在我的最终工作)。

var newObj:myObjClass = new myObjClass();
newObj.mySubXML = new Vector.<XML>();
newObj.mySubString = new Vector.<String>();

var myObj:Vector.<myObjClass> = new Vector.<myObjClass>();
myObj.push(newObj);

registerClassAlias("String", String);
registerClassAlias("XML", XML);
registerClassAlias("myObjClass", myObjClass);
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myObj);
bytes.position = 0;
myObj = bytes.readObject();

答案 3 :(得分:1)

registerClassAlias("String", String);    
registerClassAlias("VecString", Vector.<String> as Class); 

registerClassAlias("XML", XML);    
registerClassAlias("VecXML", Vector.<XML> as Class); 

registerClassAlias("myObjClass", myObjClass);    
registerClassAlias("VecMyObjClass", Vector.<myObjClass> as Class);