1

我们正在使用 EHCache 和 CF 8,通过 HTTP 使用 RESTful 接口在中央服务器上缓存内容。我正在尝试将 cfquery对象缓存到缓存服务器。

如果我直接调用 EHCache(即将它存储在本地缓存中),我可以让它工作,但如果我尝试通过 HTTP 在远程服务器上缓存,我会遇到问题。

我正在使用的代码如下:

<cfhttp url="http://localhost:8080/myCache/myKey"
  method="put" 
  result="r" 
  timeout="2" 
  throwonerror="true" >
    <cfhttpparam type="body" value="#ARGUMENTS.item#" />
</cfhttp>

CF 不喜欢这个引用#ARGUMENTS.item#并且它抱怨Complex object types cannot be converted to simple values.

谁能给我一个如何使用 CF 将对象放在 http 上的示例?如果 CF 无法做到这一点,那么 Java 示例将是下一个最佳选择。

提前谢谢了!

PS:我不想对文本/JSON等使用序列化,因为这种方法存在数据完整性问题,最重要的是它不够快。

4

2 回答 2

3

是的,您将不得不序列化参数结构,因为如果没有某种形式的序列化,就无法通过 HTTP 传递二进制对象。正如已经提到的,您可以使用 JSON 来序列化对象。JSON 的另一种替代方法是 cfwddx 标记,它可以将对象转换为 XML。但 JSON 可能更好,因为它不像 cfwddx 生成的 XML 那样冗长。

于 2010-03-25T20:30:03.750 回答
2

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就可以使用它了,它可以通过 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 表示的其他人,但我不确定它们是否一样快。

无论如何,这似乎对我很有用。谢谢大家的意见。我希望其他人觉得这很有用。

于 2010-03-26T10:15:43.623 回答