どれだけ考えたり検索したりしても、質問をした直後に答えが出てきます。
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>
これは深いコピーを作成しますが、コンポーネントがオブジェクトの最初のレベルより下にある場合は依然として問題になります。再帰的なメソッドを作成したかったのですが、金曜日の終了時刻から1時間半過ぎています。代わりに、パブで脳細胞を殺し、月曜日に再帰的な方法でこれを更新することを忘れないでください。