Trouble serializing vectors in a sub-class in AS3
Hey there! I'm trying to serialize data in AS3 but am running into a frustrating problem. Originally I had problems with "myObjClass" not being convertible, but after I discovered "registerClassAlias" I got things working allright.
Some time later, I added vectors to the myObjClass. I ran into trouble with Vector Strings before, as was reported here:
https://bugs.adobe.com/jira/browse/FP-6693
So I know the workaround is to include:
registerClassAlias("String", String);
I'm just not sure how to register an alias for a subvector within a vector (along with other variables). Here's my code:
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();
Problem #1: When these two lines are included in my compilation, the final line (bytes.readObject()) fails with the error:
Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@42edb21 to __AS3__.vec.Vector.<myObjClass>.
This is really strange. It's as if the first two registerClassAlias's are undoing the third one.
Problem #2: If I comment out the two "first problem" lines (string/xml classalias registrations) it converts myObj to myObjClass just fine; no internal error is thrown and the application is not halted. However, it fails to convert the internal String and XML vectors, with this error appearing in the application Output (without halting):
TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc11 to __AS3__.vec.Vector.<XML>.
TypeError: Error #1034: Type Coercio开发者_运维百科n failed: cannot convert __AS3__.vec::Vector.<Object>@3aabc41 to __AS3__.vec.Vector.<String>.
So my question is, How can I register a class alias for:
- Vector.(myObjClass)
- A vector of Strings as a property of Vector.(myObjClass)
- A vector of XML as a property of Vector.(myObjClass)
All at the same time?
Looks like moving:
registerClassAlias("XML", XML);
registerClassAlias("String", String);
Into myObjClass directly did the trick, while retaining:
registerClassAlias("myObjClass", myObjClass);
In the serialization class. I'm not sure why storing the three together in the serialization class wasn't working - and was generating strange errors if I changed the order of the code, so the problem might just be some glitch on specific machine.
When you want to use a complex vector content, you have to register your each sub-class (for you Vector.[String]) as follow :
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>;
}
Testing your code Andy you need to register the class you created so bytes.readObject()
returns a vector with the custom classes - in this case the class myObjClass. So if you add this line of code:
registerClassAlias("myObjClass", myObjClass);
So if you alter the code to look like this then you should return the object with all its data correctly serialized (I did a simple test and it seems to work on my end).
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();
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);
精彩评论