Search code examples
apache-flexserializationblazedsamftransient

Flex blazeds/lcds AMF serialization for transient variables


I am using LCDS and Flex. When I am sending an object from java to Flex, I donot want to send all the properties. As far as I know, if you do not want to serialize make a variable transient.

eg.

 private transient Date birthDate;

 public Date getBirthDate(){  
    return birthDate;
 }

 public void setBirthDate(Date val){
    birthDate = val;
    //Some code here.
 }

Now the serialized object should not have birthDate in it. But When I see the AMF logs , the object has the birthDate with value in it.
Does serialization looks into code and checks the private variable is transient.( I don't understand how it has access to private property. I am little confused.)
Should I mark variable as public. Then getters and setters make no sense and moreover I write some code in setter method. So I need setter.

Questions:

  1. I read in a book(Enterprise flex with blazeds by Brain Telintelo, Chapter 15) that out of box Blazeds only serializes fileds that have matching getters and setters. If this is the case, will blazeds even bothers to check private property as transient.

  2. Can some body please explain how normal serializtion( not amf serializtion ) takes place and keeps track of private transient variables even though they have public getters and setters.

  3. How do I make a java variable not serialize in Flex/LCDS/BlazeDS environment.

I have 50-60 variables in objects and 4 or 5 varibales should not be seriablezed. So writing custion Serializer in such a large objects is a big pain. And another disadvantage I see is hibernate will not be able to use this object if I write my own serializer.


Solution

  • I usually use Granite Data Services (rather than LCDS or Blaze), but have you tried using the [Transient] ActionScript tag? (Of course if you're generating your .as classes, this might be an issue - perhaps there's a @Transient annotation?)

    http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html

    The way this works depends on who (what) is doing the serialization. For example Granite, I believe, behaves slightly differently than Blaze. I don't think Granite serializes private attributes (could be recalling this wrong). Also I do recall a few years back, I created a custom serialization class for Granite which tells it to ignore fields with the 'transient' Java keyword (using reflection).

    I don't know if you can implement custom serialization logic in Blaze/LCDS (just as easily) but that might be something worth looking into as well. It wasn't a huge pain (as you say) because it was just a single class that I customized, but again I only know for sure that this is simple w/Granite.

    There may be a helper lib or two out there for this. The guy wrote wrote this http://www.flexpasta.com/index.php/2008/05/19/blazeds-with-annotations-for-remote-objects/ appears to be doing what you're asking in reverse. (Force serialization when no setter.)