YOUR FEEDBACK
NGASI Releases AppServer Manager 8.1
Dave Jenkins wrote: The remote server management is a welcomed added feature...
SOA World Conference
Virtualization Conference
$200 Savings Expire May 16, 2008... – Register Today!


2007 West
GOLD SPONSORS:
Active Endpoints
Your SOA Needs BPEL for Orchestration
BEA
Virtualized SOA: Adaptive Infrastructure for Demanding Applications
Nexaweb
Overcoming Bandwidth Challenges with Nexaweb
TIBCO
What is Service Virtualization?
SILVER SPONSORS:
WSO2
Using Web Services Technologies and FOSS Solutions
Click For 2007 East
Event Webcasts

2008 East
PLATINUM SPONSORS:
Appcelerator
Think Fast: Accelerate AJAX Development with Appcelerator
GOLD SPONSORS:
DreamFace Interactive
The Ultimate Framework for Creating Personalized Web 2.0 Mashups
ICEsoft
AJAX and Social Computing for the Enterprise
Kaazing
Enterprise Comet: Real–Time, Real–Time, or Real–Time Web 2.0?
Nexaweb
Now Playing: Desktop Apps in the Browser!
Sun
jMaki as an AJAX Mashup Framework
POWER PANELS:
The Business Value
of RIAs
What Lies Beyond AJAX?
KEYNOTES:
Douglas Crockford
Can We Fix the Web?
Anthony Franco
2008: The Year of the RIA
Click For 2007 Event Webcasts
SOA World Editorial: Defining Terms
It seems like not a day goes by lately in which some new story of malfeasance in office doesn't come out - whether it's lying under oath, using the services of a call girl, or spying on other officials in the government in order to further a personal agenda. Clearly, our elected officials don't have
SYS-CON.TV
TODAY'S TOP SOA & WEBSERVICES LINKS


JSON Serialization with Appcelerator Java Services
Serializing/transforming model objects is really easy to do with Appcelerator IModelObjects

Digg This!

The issue of serializing/transforming model objects is not new, heck I’ve been doing this for quite some time:

  • RMI (ejb/corba)
  • XML (jms, soap, etc..)
  • JSON 
JSON is not the only way to serialize objects for Web 2.0 applications, but it's the most abundant and heavily used throughout the Appclerator framework. Doing this is actually really easy to do with Appcelerator IModelObjects. Our IModelObjects can easily be used along with Hibernate for persistance, but let's leave that for later for now.

When you define your Model classes, there are some very simple things to keep in mind:
  • annotate your attributes with @MessageAttr
  • have your class implement IModelObject

Here is a simple example:

<public class User implements IModelObject, Serializable {
private static final long serialVersionUID = 1L;
@MessageAttr
public String name;

public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
...
}

Unit test it

Now to test the rendering of our object to JSON with a simple junit test…. As you can see, we leverage the Appcelerator framework to serialize our objects to JSON

public class ForumTest extends TestCase {
 
public void testSimple() {
User user = createUser();
Message message = new Message();
JSONMessageDataObject data = new JSONMessageDataObject();
message.setData(data);
message.getData().put("user", user);
message.getData().put("count", 1);
String messagestr = data.toDataString();
assertEquals(messagestr,"\"user\":{\"password\":
\"pwd\",\"threads\":0,\"fullName\"
:\"antewew\",\"username\":\"azuercher\",\"state\":
\"mystate\",\"email\":\"email\",
\"posts\":0,\"id\":0},\"count\":1}");
}
private User createUser() {
User user = new User();
user.setEmail("email");
user.setFullName("ante wew");
user.setId(new Long(0));
user.setPassword("pwd");
user.setPosts(new Long(0));
user.setState("mystate");
user.setThreads(new Long(0));
user.setUsername("azuercher");
return user;
}
}

Dealing with recursion

Whats always a bit of a tangle is understanding how to deal with the recursive/circular relationship.
If you take a look at JSONObject you will see 2 overridden methods for createBean

public static JSONObject createBean(IModelObject object,MessageAttr
    parentAtt, String context,String[] parentSuppres,int level, int maxlevels)
public static JSONObject createBean(IModelObject object)

The latter is obviously a bit more simple, but the former is where the power is. In the MessageAttr annotation, you can provide the suppress attribute which is a comma separated list of aggregates (using bean.name notation to not serialize). This is used for attributes in your IModelObject implementation where the association is with another IModelObject. The following model is for a forum object model where the following aggregate hierarchy exists:

* Forum
** ForumThread
*** Post

In the snippet below, I’ve omitted the getter/setter methods for the aggregates for simplicity.

public class User implements IModelObject, Serializable {
@MessageAttr (suppress="user,thread.lastPost")
public Post lastPost;
}
public class Post implements IModelObject, Serializable {
@MessageAttr(suppress="lastPost,forum.lastPost")
public Forumthread thread;
 
@MessageAttr (suppress="lastPost")
public User user;
}
public class Forumthread implements IModelObject, Serializable {
@MessageAttr (suppress="lastPost")
public Forum forum;
@MessageAttr (suppress="thread,user.lastPost")
public Post lastPost;
}
public class Forum implements IModelObject, Serializable {
@MessageAttr (suppress="thread.forum,thread.lastPost,user.lastPost")
public Post lastPost;
}

Rolling your own serialization

Assuming you know what your JSON string is going to look like, you can use our RawMessageDataList and RawMessageDataObject to serialze your objects. This is pretty useful if you already are rendering JSON in an existing framework and don’t want to have to transform to and back again. The snippet below shows with static strings just so that you get the idea:

IMessageDataList people = new
RawMessageDataList(
"[{'name':'joe','age':22},{'name':'jane','age':33}]");
IMessageDataList dog = new RawMessageDataObject("{'breed':'doberman','weight':78}");
Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("people", people);
message.getData().put("dog", dog);

Using Coarse Grained objects

This is probably the simplest/prettiest way to implement your services assuming that you aren’t interested in using fine grained classes that are associated with most of today’s persistence frameworks. Here is how you would create a single compound JSON object:

IMessageDataObject dog =
MessageUtils.createMessageDataObject();
obj.put("breed","doberman");
obj.put("wieght",78);Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("dog", dog);

and now with a collection:

IMessageDataList&lt;IMessageDataObject&gt; people=
MessageUtils.createMessageDataObjectList();
IMessageDataObject joe =
MessageUtils.createMessageDataObject();
joe.put("name","joe");
joe.put("age",22);
IMessageDataObject jane =
MessageUtils.createMessageDataObject();
joe.put("name","jane");
joe.put("age",33);
people.put(joe);
people.put(jane);
Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("people", people);

Summary

As you can see there are quite a bit of alternatives for you based on what your needs are to accommodate your service implementations. I’ve personally used all of the above as I’ve implemented:

  • Model Objects: using Hibernate for persistence
  • Custom Serialization: for integrating with pre-rendered objects (commons-monitoring)
  • Coarse Grained: in implementing a dashboard/event driven solution
About Andrew Zuercher
Andrew Zuercher is an Enterprise Architect at Appcelerator, advocating the implementation of RIA with agile methodologies.

Duty Editor wrote: No problem Andrew, we've taken cxare of it.
read & respond »
andrew zuercher wrote: to dove tail on the feedback that i left last friday, i was wondering if you could corect the reference to http://zuerchtech.com instead of http://zuerchertech.com which is not associated with me whatsoever. much thanks, -andrew zuercher
read & respond »
Andrew Zuercher wrote: Thanks for publishing this article which is also cross posted at: * http://www.appcelerant. com/json-serialization-wi th-appcelerator-java-serv ices.html * http://zuerch tech.com/2008/2/8/json-se rialization-with-appceler ator-java-services Please note, that although I ran Zuercher Technologies based out of Atlanta, GA I have since dissolved it and now am employed at Appcelerator (http://appcelerator.com) as an Enterprise Architect advocating the implementation of RIA with agile methodologies.
read & respond »
SOA WORLD LATEST STORIES
HP Launches New Versions Of SOA Testing Products
HP has introduced enhanced quality and management software designed to meet new requirements for mainstream deployment of service-oriented architectures (SOA) by businesses. To make sure that services meet all functional and performance objectives and are ready for production deploymen
Why Enterprise Architects Continue to Fall Short with SOA
If you read this column and listen to my podcasts, you know that I call SOA what SOA is - an architectural pattern. In many instances, SOA is a vital component of healthy enterprise architecture. Indeed, I've provided some keynote talks around this very topic at about half-a-dozen ente
Aras Delivers Version 9 of Advanced Model-Based SOA for Enerprise PLM
Aras announced the availability of Version 9 of the Aras Innovator suite of model-based service-oriented architecture (SOA) solutions for enterprise Product Lifecycle Management (PLM). Version 9 delivers model-based SOA for PLM and includes single-instance multi-language capabilities a
Skyway Software Launches SOA Developer Contest at JavaOne
Skyway Software, announced a SOA developer contest. The SOA design and delivery solutions provider announced the contest with a prize of a $2500 gas card for the winner. The company feels that the basics are very easy. The winner would also get a copy of the Skyway SOA Platform - Devel
Micro Focus Upgrades SOA Express for IBM CICS
Micro Focus announced the availability of SOA Express 8.0. The new version adds support for direct deployment into IBM's Customer Information Control System (CICS), enabling users to accelerate the deployment of Web services by reusing their existing CICS TS mainframe infrastructure in
Oracle Previews Fusion Middleware 11g
Building on its November 2007 preview, Oracle previewed additional planned feature enhancements of Oracle Fusion Middleware 11g. Based on feedback resulting from close cooperation with customers testing in real-world environments, the latest preview of Oracle Fusion Middleware 11g incl
SUBSCRIBE TO THE WORLD'S MOST POWERFUL NEWSLETTERS
SUBSCRIBE TO OUR RSS FEEDS & GET YOUR SYS-CON NEWS LIVE!
Click to Add our RSS Feeds to the Service of Your Choice:
Google Reader or Homepage Add to My Yahoo! Subscribe with Bloglines Subscribe in NewsGator Online
myFeedster Add to My AOL Subscribe in Rojo Add 'Hugg' to Newsburst from CNET News.com Kinja Digest View Additional SYS-CON Feeds
Publish Your Article! Please send it to editorial(at)sys-con.com!

Advertise on this site! Contact advertising(at)sys-con.com! 201 802-3021

SYS-CON FEATURED WHITEPAPERS


ADS BY GOOGLE