【问题标题】:ColdFusion Serialize Client VariablesColdFusion 序列化客户端变量
【发布时间】:2012-01-16 12:16:42
【问题描述】:

我希望将会话转换为客户端变量,以便我可以迁移到集群环境。

我想知道是否有任何聪明的方法可以做到这一点。我想我可以编写一些标准例程,它有一个 setter / getter,你总是用它来设置 / 获取客户端变量。理想情况下,这种方法只适用于每个 cfm / cfc。

我正在考虑使用一个 application.Client 对象来执行此操作并执行类似的操作

application.Client.set('name', 变量)

然后

application.Client.get('name', 变量)

序列化将在那里发生。在走这条路之前,有没有人做过类似的事情,根据类型(即 Stuct vs Array vs Query 等)对不同的数据进行序列化。

【问题讨论】:

    标签: json coldfusion


    【解决方案1】:

    这会很困难,因为正如您之前的一个问题所述,CLIENT 范围不能完全模拟 SESSION 范围,因为它只能包含简单的变量。例如,您不能在 CLIENT 中存储结构。

    但是,其中一种简单的变量类型是字符串。

    所以,理论上,如果有办法将复杂的数据结构序列化为字符串,它就可以工作。

    幸运的是,您有一个机制可以做到这一点:<CFWDDX>

    <cfset data = StructNew() />
    <cfset data.name = "Dale" />
    <cfset data.type = "CF Programmer" />
    
    <cfwddx action="cfml2wddx" input="#data#" output="serial" />
    
    <cfset CLIENT.data = serial />
    

    如果您看一下您的 CLIENT.data var(串行),您会看到它看起来像:

    <wddxPacket version='1.0'><header/><data><struct><var name='TYPE'><string>CF Programmer</string></var><var name='NAME'><string>Dale</string></var></struct></data></wddxPacket>
    

    请记住,这并不适用于所有解决方案。您将无法序列化 CFC。另请记住,cookie 有大小限制(在某些配置中,可以物理存储 CLIENT 变量),因此您有机会从非常大的数据结构中丢失数据。

    您可以按照上面的建议,将此序列化/反序列化包装在您位于应用程序范围内的 CFC 中。 &lt;CFWDDX&gt; 的便利之处在于它是结构、数组和所有其他类型的一刀切。

    也许不是一个非常稳健或长期的解决方案,但可能会为您指明正确的方向。

    【讨论】:

    • 当然,如果他们使用数据库存储,则可以避免 cookie 限制(这更有可能,因为它更类似于会话存储并且打开的安全风险更小)。另外,不要忘记您可以像使用 WDDX 一样使用 JSON 进行序列化。
    【解决方案2】:

    无论基础对象如何,序列化本身都应该相同。您可以使用 JSON 或 WDDX 进行序列化,但我会使用 JSON,因为它不那么冗长。您应该注意,您只能将可序列化的对象存储在客户端范围内——例如,如果您的会话范围有对组件的引用,那么这些组件将无法被序列化并存储在客户端范围内。除此之外,您的基本方法应该可以正常工作。

    【讨论】:

    • 是的,我想我更喜欢 JSON,我担心数据库的大小。
    【解决方案3】:

    对于我的一个项目,我使用了相同的方法。通常我在应用程序的每个地方都使用客户端变量,所以我调用了客户端变量 onRequest,将其反序列化并存储在请求变量中以使其可用。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多