一段时间后,我向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>.
所以我的问题是,我如何注册类别:
所有这些都在同一时间?
答案 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);