代码之家  ›  专栏  ›  技术社区  ›  Ciaran Archer

coldfusion8和httpput—有没有方法放置对象?

  •  1
  • Ciaran Archer  · 技术社区  · 16 年前

    我们将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不喜欢这个引用 #ARGUMENTS.item# 它抱怨道 Complex object types cannot be converted to simple values.

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   Richard Davies    16 年前

        2
  •  2
  •   Ciaran Archer    16 年前

    我想我可以使用上面的代码,如果我做下面的 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表示的人,但我不确定他们是否有这么快。

    推荐文章