Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 Coercion 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?

like image 544
Andy Moore Avatar asked Dec 12 '22 13:12

Andy Moore


1 Answers

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.

like image 107
Andy Moore Avatar answered Dec 23 '22 09:12

Andy Moore