Coldfusion 8 : Serialize and Deserialize a Component
I am working on a project where a requirement for serializing and deserializing a component came up. This is possible now with ColdFusion 8, since the underlying work was done (by Rakshith) to handle synchronizing sessions across a cluster. Nonetheless, there is no specific serialize or deserialize function for a CFC. Pete Frietag wrote about this as did Rakshith in earlier posts. My code below borrows pretty liberally from theirs but distills it into two CFC methods that I include a utility component to handle the serializing and deserializing.
Also, I am not writing the serialized data to a file as in their examples, but passing you back Base64 data in the one case of the serialize() method. This was done so I could store the result in a database for reasons I won't get into here. One odd thing that came up when I tested this was that putting a returntype of "component" would not work on the deserialize method even though the result looks and behaves like a component instance, thus the returntype of "any." Below is the code for the two methods (keep in mind, I have only tested this on some simple CFC instances, share if you run into any issues).
<cffunction name="serializeCFC" access="public" output="false" returntype="String">
<cfargument name="cfc" type="component" required="true">
<cfset var byteOut = CreateObject("java", "java.io.ByteArrayOutputStream") />
<cfset var objOut = CreateObject("java", "java.io.ObjectOutputStream") />
<cfset byteOut.init() />
<cfset objOut.init(byteOut) />
<cfset objOut.writeObject(arguments.cfc) />
<cfset objOut.close() />
<cfreturn ToBase64(byteOut.toByteArray()) />
</cffunction>
<cffunction name="deserializeCFC" access="public" output="false" returntype="any">
<cfargument name="base64cfc" type="string" required="true" />
<cfset var inputStream = CreateObject("java", "java.io.ByteArrayInputStream") />
<cfset var objIn = CreateObject("java", "java.io.ObjectInputStream") />
<cfset var com = "" />
<cfset inputStream.init(toBinary(arguments.base64cfc)) />
<cfset objIn.init(inputStream) />
<cfset com = objIn.readObject() />
<cfset objIn.close()>
<cfreturn com />
</cffunction>
Brian Rinaldi is a software engineer for Pongo Resume (http://www.pongoresume.com) specializing in ColdFusion, Flex and AIR development. He is an Adobe Community Expert and the manager of the Boston ColdFusion User Group. Brian also organizes RIA Unleashed : Boston (www.riaunleashed.com). Brian is a DZone MVB and is not an employee of DZone and has posted 10 posts at DZone. You can read more from them at their website.
- Login or register to post comments
- 2190 reads
- Printer-friendly version
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)










Comments
bet replied on Mon, 2009/06/08 - 6:32am