2011-06-10 58 views
2

我想在會話中存儲的類實例保存已加載DOMDocuments的數組。會話序列化後維護XML文檔狀態

正如其中一個答案中所述:PHP quirks and pitfalls,當您序列化一個包含XML的對象時,XML結構不能存在反序列化過程。據我瞭解,PHP5應該自動序列化會話數據,所以我需要知道的是如何讓XML在序列化/反序列化過程中生存下來?

我讀過關於它看起來不能完成的內容,再加上使用自動序列化/反序列化來編寫和讀取會話文件所涉及的開銷似乎使得它最好只讀取和寫入XML文件在__sleep和__wakeup的類實例中。是這樣嗎?

+0

如果你想在文件中存儲的東西考慮堅持其他更多功能的數據格式,例如JSON。有'json_decode()'和'json_encode()'來幫助你。請參閱http://www.json.org/xml.html – sanmai 2011-06-20 07:00:57

回答

2

http://php.net/manual/en/function.serialize.php

這是用於存儲或傳遞PHP值,而不會失去它們的類型和structure.`

的值被序列化是有用的。 serialize()處理所有類型,但資源類型除外。你甚至可以序列化()包含自身引用的數組。您正在序列化的數組/對象內的循環引用也將被存儲。任何其他參考將會丟失。

或許你可以考慮存儲原始數據到內存緩存,數據庫,
而您的會話指向一個(如內存緩存鍵,數據庫行ID )


額外讀了

你可能會覺得逗以下(也許我是錯的) -

+0

對不起,如果我在這裏密集,但這是否意味着,因爲DOMDocuments是資源他們沒有序列化,所以不會存儲在會話超出當前頁面? – shanethehat 2011-06-17 11:30:27

+1

這是沒有記錄,但基於此說明因爲資源變量持有特殊的處理程序打開文件,數據庫連接,圖像畫布區域等......等包括simplexml,memcache,dom..etc – ajreal 2011-06-17 11:35:15

+0

非常好玩:)不幸的是,如果數據庫是一個選項,我根本不會使用XML!我想現在我會繼續寫任何更改回我的__sleep函數類中的文件。 – shanethehat 2011-06-17 12:03:42