Я понял, что могу использовать точный код выше, если сделаю следующее для переменной ARGUMENTS.item
, прежде чем передать ее функции:
<cfquery name="qData" datasource="#VARIABLES.dsn#">
select * from myData
</cfquery>
<!--- Setup and init Java objects --->
<cfset byteArrayOutputStream = createObject("java","java.io.ByteArrayOutputStream") />
<cfset objectOutputStream = createObject("java","java.io.ObjectOutputStream") />
<cfset byteArrayOutputStream.init() />
<cfset objectOutputStream.init(byteArrayOutputStream) />
<!--- Serialize the cfquery object --->
<cfset objectOutputStream.writeObject(qData) />
<cfset serializedQuery = toBase64(byteArrayOutputStream.toByteArray()) />
<cfset objectOutputStream.close() />
<!--- Stick in the cache --->
<cfset myCache.put(myCacheName, key, serializedQuery) />
Бинго! После этого serializedQuery
будет использоваться, и он может быть PUT через провод по HTTP. Когда вы получите его обратно из EHCache, вам нужно будет сделать следующее:
<!--- Get result value from cache --->
<cfset cacheData = myCache.get(myCacheName, key) />
<!--- Java objects setup --->
<cfset byteArrayInputStream = createObject("java","java.io.ByteArrayInputStream") />
<cfset objectInputStream = createObject("java","java.io.ObjectInputStream") />
<!--- deserialize --->
<cfset ba = toBinary(cacheData) />
<cfset byteArrayInputStream.init(ba) />
<cfset objectInputStream.init(byteArrayInputStream) />
<cfset deserializedQuery = objectInputStream.readObject() />
<cfset objectInputStream.close() />
<!--- Dump query --->
<cfdump var="#deserializedQuery#" />
Этот тип сериализации тоже очень, очень быстрый. Я могу понять других, используя представления JSON, но я не уверен, что они такие быстрые.
В любом случае, мне кажется, это отлично работает. Спасибо всем за ваш вклад. Я надеюсь, что другие найдут это полезным.