Java Coldfusion 8和HTTP PUT-有没有一种放置对象的方法?

Java Coldfusion 8和HTTP PUT-有没有一种放置对象的方法?,java,http,coldfusion,serialization,ehcache,Java,Http,Coldfusion,Serialization,Ehcache,我们使用EHCache和CF8,通过HTTP上的RESTful接口在中央服务器上缓存内容。我正在尝试将cfquery对象缓存到缓存服务器 如果我调用EHCache direct(即,将其存储在本地缓存中),我可以让它工作,但如果我尝试通过HTTP在远程服务器上缓存,我会遇到问题 我使用的代码如下: <cfhttp url="http://localhost:8080/myCache/myKey" method="put" result="r" timeout="2"

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

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

我使用的代码如下:

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

CF不喜欢引用
#参数。项#
,它抱怨
复杂对象类型无法转换为简单值。

有人能给我举个例子说明如何使用CF将对象放到http上吗?如果使用CF无法做到这一点,那么Java示例将是下一个最好的选择

非常感谢


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

是的,您必须序列化参数结构,因为没有某种形式的序列化,无法通过HTTP传递二进制对象。如前所述,可以使用JSON序列化对象。JSON的另一种替代方法是cfwddx标记,它可以将对象转换为XML。但是JSON可能更好,因为它不像cfwddx生成的XML那样详细。

是的,您必须序列化参数结构,因为没有某种形式的序列化,无法通过HTTP传递二进制对象。如前所述,可以使用JSON序列化对象。JSON的另一种替代方法是cfwddx标记,它可以将对象转换为XML。但是JSON可能更好,因为它没有cfwddx生成的XML那么详细。

我发现如果我对
参数执行以下操作,我可以使用上面的确切代码。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) />
这种类型的序列化也非常非常快。我可以理解其他使用JSON表示的人,但我不确定他们是否有这么快


不管怎样,这对我来说似乎很有效。谢谢大家的意见。我希望其他人会觉得这很有用。

我发现如果我对
参数执行以下操作,我可以使用上面的代码。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) />
这种类型的序列化也非常非常快。我可以理解其他使用JSON表示的人,但我不确定他们是否有这么快


不管怎样,这对我来说似乎很有效。谢谢大家的意见。我希望其他人会觉得这很有用。

您能切换到CF9吗?它内置了ehcache挂钩。在cfhttpparam/value中传递的值必须是字符串-文本或二进制。您必须以某种方式序列化arguments.item。@kevink-CF9只允许缓存到本地系统,而不允许缓存到中心缓存服务器AFAIK。我们正在使用群集环境。@CF绝地大师-序列化的最快方法是什么?通过CF的JSON方法非常昂贵。可以尝试使用本机Java JSON序列化程序,而不是CF本身内置的序列化程序。是的,我知道CF最终会被编译成JVM字节码,但是用本机Java编写的解析器可能比CF编译的解析器性能更好。只是一个想法。或者使用协议缓冲区进行二进制序列化。您可以切换到CF9吗?它内置了ehcache挂钩。在cfhttpparam/value中传递的值必须是字符串-文本或二进制。您必须以某种方式序列化arguments.item。@kevink-CF9只允许缓存到本地系统,而不允许缓存到中心缓存服务器AFAIK。我们正在使用群集环境。@CF绝地大师-序列化的最快方法是什么?通过CF的JSON方法非常昂贵。可以尝试使用本机Java JSON序列化程序,而不是CF本身内置的序列化程序。是的,我知道CF最终会被编译成JVM字节码,但是用本机Java编写的解析器可能比CF编译的解析器性能更好。只是一个想法。或者使用协议缓冲区进行二进制序列化。