2012-01-14 2 views
0

Я хочу преобразовать переменные сеанса в клиент, чтобы я мог перейти в кластерную среду.Переменные клиента ColdFusion Serialize

Мне интересно, есть ли какой-нибудь умный способ сделать это. Я решил, что могу написать стандартную процедуру, в которой есть сеттер/получатель, который вы всегда используете для установки/получения переменных клиента. В идеале этот метод будет доступен только в каждом cfm/cfc.

Я имел в виду иметь объект application.Client, который будет делать это и сделать что-то вроде

application.Client.set ('имя', переменная)

затем

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

Сериализация произойдет там. Прежде чем отправиться по этому пути, кто-нибудь сделал что-то подобное, сериализует данные, разные в зависимости от типа, то есть Stuct vs Array vs Query и т. Д.

ответ

2

Это будет сложно, потому что, как указано в одном из ваших более ранних вопросов, КЛИЕНТ scope не может полностью подражать области SESSION, поскольку тот факт, что он может включать только простые vars. Например, вы не можете сохранить структуру в КЛИЕНТЕ.

Но одним из таких простых типов переменных является строка.

Итак, теоретически, если бы у кого-то был способ сериализации сложной структуры данных в строку, он мог бы работать.

К счастью, у вас есть механизм, чтобы сделать это: <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 вар (последовательный) вы увидите это выглядит примерно так:

<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> 

Имейте в виду, что это не будет работать для всех решений. Вы не сможете сериализовать ХФУ. Помните также, что существует ограничение на размер файлов cookie (где переменные CLIENT могут храниться физически в определенных конфигурациях), поэтому у вас есть шанс потерять данные из очень больших структур данных.

Вы можете обернуть эту сериализацию/де-сериализацию в CFC, который вы размещаете в области приложения, как вы предлагаете выше. Удобство здесь с <CFWDDX> заключается в том, что он является единственным размером для всех структур, массивов и всех других типов.

Возможно, это не очень надежное или долгосрочное решение, но может указывать на вас в правильном направлении.

+2

Конечно, ограничение на файлы cookie можно избежать, если они используют хранилище базы данных (и это более вероятно, поскольку оно более похоже на хранилище сеансов и снижает риск безопасности). Кроме того, не забывайте, что вы можете сериализовать с JSON так же хорошо, как WDDX. –

+0

+1 для обоих этих предложений, очень хорошие альтернативы. –

1

Сериализация сама по себе должна быть одинаковой независимо от базового объекта. Вы можете либо сериализоваться с помощью JSON, либо с WDDX, но я бы пошел с JSON, так как это менее подробный. Следует отметить, что вы сможете хранить только сериализуемые объекты в клиентской области - если ваша область сеанса имеет ссылки на компоненты, например, они не смогут быть сериализованы и сохранены в области клиента. Помимо этого, ваш базовый подход должен работать нормально.

+0

Да, я думаю, что я предпочитаю JSON, я беспокоюсь о размере БД. –

0

Для одного из моих проектов я использую такой же подход. Обычно я использовал клиентскую переменную в каждом месте приложения, поэтому у меня была клиентская переменная onRequest, десериализована и хранилась в переменной запроса, чтобы сделать ее доступной.

надеюсь, что эта помощь.

Смежные вопросы