Не имеет значения, как долго вы думаете / ищите, вы всегда найдете ответ сразу после того, как задаете вопрос.
Мне удалось решить эту проблему путем преднамеренного неправильного использования try / catch, поэтому я перебрал структуру, попытался создать объект из каждого элемента, как если бы он был компонентом, и по ошибке скопировал его. к моей структуре снимка. Мне также пришлось хранить его в другой области, в моем случае я использовал сессию, поскольку, если я позволю ему перейти к переменным по умолчанию, будет циклическая ссылка, которая приведет к структуре с бесконечным числом дочерних элементов.
РЕДАКТИРОВАТЬ: ЭТО НЕ ДЕЛАЕТ, ЧТО Я ДУМАЛ, ЧТО ЭТО ДЕЛАЛ, СМОТРИ НИЖЕ
<cfset session.varSnapShot = StructNew()>
<cfset loopList = StructKeyList(variables)>
<cfloop from="1" to="#ListLen(loopList)#" index="i">
<cftry>
<cfobject name="x#i#" component="#variables[ListGetAt(loopList,i)]#">
<cfcatch>
<cfset session.varSnapShot[ListGetAt(loopList,i)]= variables[ListGetAt(loopList,i)]>
</cfcatch>
</cftry>
</cfloop>
РЕДАКТИРОВАТЬ: Поскольку вышеприведенное на самом деле не делает глубокую копию (спасибо Ли), я придумал это:
<cfloop from="1" to="#ListLen(loopList)#" index="i">
<cfset metaData = GetMetaData(variables[ListGetAt(loopList,i)])>
<cfif isStruct(metaData) AND isDefined("metaData.type") AND metaData.type EQ "component">
<cfelse>
<cfset session.varSnapShot[ListGetAt(loopList,i)]= duplicate(variables[ListGetAt(loopList,i)])>
</cfif>
</cfloop>
Это делает глубокое копирование, но все равно будет проблемой, если компонент находится ниже первого уровня объекта. Я хотел создать рекурсивный метод, но в пятницу прошло уже полтора часа. Вместо этого я убью мозговые клетки в пабе и, возможно, обновлю это рекурсивным методом в понедельник, если я не забуду.