ColdFusion序列化客户端变量

时间:2012-01-14 01:26:55

标签: json coldfusion

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

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

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

的操作

application.Client.set('name',variable)

然后

application.Client.get('name',variable)

序列化将在那里发生。在沿着这条路走下去之前,有人做过类似的事情,根据类型将数据序列化不同,即Stuct vs Array vs Query等。

3 个答案:

答案 0 :(得分:2)

这很难,因为正如您之前提到的一个问题所述,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(serial),你会发现它看起来像:

<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中,如上所述。 <CFWDDX>的便利之处在于它对于结构,数组和所有其他类型来说都是一刀切的。

可能不是一个非常强大或长期的解决方案,但可能会指出你正确的方向。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

希望这有帮助。