Flex / AIR Serialization Lessons Learned

A few lessons learned while serializing custom classes.

Compiler metadata tags only get you part of the way. Metadata alone is perfectly suitable when you’re not serializing classes with members that contain complex datatypes where those complex types have private members.
serialization metatdata tags

If there are private members in your complex data types then you’ll need to implement IExternalizable.
implement IExternalizable

IExternalizable requires implementing two methods, ‘readExternal’ and ‘writeExternal’.
iexternalizable implementation example

Another thing to watch out for is that it appears you must use a no args constructor in order to deserialize an object. If anyone knows otherwise please leave details in the comments.
serialization no args constructor

AS3 makes it ultra simple to serialize variables via the IDataInput and IDataOutput objects. You just need to remember, when writing out things like Strings, to use writeUTF / readUTF rather than writeUTFBytes / readUTFBytes. The writeUTF method inserts a UTF string representing the number of bytes in each String which means you don’t have to do any grunt work when deserializing with readUTF — nice.



5 Responses to “ “Flex / AIR Serialization Lessons Learned”

  1. Great article, I lost a lot of blood learning these things on my own :) but I would like to pass on another tidbit to add to your post. When your AS packages do not match your java classes you have to register the alias in addition to adding the meta data described above. The scenario is this:
    AS3 class name: com.example.as.Widget
    Java class name: com.example.java.Widget

    Put this line somewhere in your startup class after importing your Widget

    flash.net.registerClassAlias(“com.example.java.Widget”, Widget);

    Everything should work from this point on, but as a best practice make sure your packages match!!

  2. James Law says:

    Thanks!
    Using Blaze DS it seems to require on the JAVA side, that objects have public setter methods for properties. This doesn’t make sense to me but it seems so…

    JL

  3. Jamie Bisotti says:

    We are currently using Granite Data Services (GDS) instead of BlazeDS (we were using it before BlazeDS was open-sourced); it provides a bit more flexibility when it comes to serialization. For example, it’s Externalizer’s provide an additional method, newInstance(…). We override this instead of readExternal(…) which allows us to use immutable objects (i.e. no setters; no default no-arg constructor). We haven’ had any problems with it so far.

    Might be worth a look.

    Jamie

  4. Sean says:

    Just use null defaults to get around constructor argument problems, we do this all the time.

    public function AuthToken(token:String=null, perms:String=null, etc…){
    }

  5. AndyChou says:

    Need 3 Flex engineers in New York City:
    1. You have to be living in New York City for now.
    2. Work part time or full time with us.
    3. Good at Adobe Flex technology.
    4. Please contact us for other requirement and details.

    Busycode Inc. is a top Adobe Flex shop who develops Flex/AIR applications for clients.
    For more info, please visit http://www.busycode.com

Leave a Reply