Coldfusion 8 : Serialize and Deserialize a Component
Join the DZone community and get the full member experience.Join For Free
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 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() />
<cfreturn com />
Published at DZone with permission of , DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.