我有一個很好的答案,一個不好的答案,然後解決您的問題的答案。
很好的回答
如果我可以把這個地方是個完全:你可能真的不希望這樣做的。你提到類名有時比實際數據更長。如果是這種情況,那麼總體而言,序列化中幾乎沒有數據。除非你有一些可笑的長命名空間/類名(在這種情況下,你可能想重新考慮你的應用程序結構),我想你的序列化字符串將很容易適合,例如,MySQL文本字段。重點是,如果你只有一點點的數據,我真的懷疑用一種標準格式來削減少於一千字節的數據是值得的。任何合理的數據庫和服務器都將能夠毫無問題地處理這些事情,即使您擁有數百萬和數百萬個這樣的記錄。所以除非這是一種低內存的嵌入式設備,否則我會很好奇聽到你爲什麼認爲你需要這樣做(當然這是修辭:我認真地懷疑你是在嵌入式設備上運行PHP)。
如果做嘗試做這樣的事情,你要補充一點,你將不得不保持每個人都會看着你,並說碼「什麼在世界上是怎麼回事? 」。它取決於你的需要,但我懷疑你更可能通過代碼來引入問題,這將使這個功能發生,而不是簡單地讓你的序列化數據變長。
不好回答
我真的不認爲你想將序列數據的任何變化。要直接回答你的問題之一:不,沒有辦法縮短命名空間,仍然使用PHP的unserialize()
方法,除非在應用程序中完全拋棄命名空間。我真的懷疑你想這樣做。
您的其他選擇是手動調整序列化的字符串。然後你可以存儲這個「修改的序列化格式」(我們稱之爲)。然後,當你需要反序列化時,你必須扭轉你的modSerialized函數,並且可以正常運行unserialize()
。這樣做的麻煩在於PHP的serialize
方法的輸出代表了一種標準的並且完善的編碼。修改它本來就是容易出錯的,根據定義,它將違背標準的最佳實踐。如果你非常小心並且寫了很多代碼,你可以毫無問題地做到這一點,我認爲你不想這麼做。例如,你可以想象找到並替換\Namespace1\Subnamespace\dataobjectA
與胡言亂語,因爲你想確保你不會意外地用你的字符串中實際發現的東西替換它。然後你必須記住你輸入的是什麼樣的亂碼,以及它代表什麼,所以你可以稍後改變它。如果你成功地做到了這一點,那麼新的!你只是重新發明了車輪,並建立了一個專門的壓縮算法!
真的,你也不想這樣做。或者如果你這樣做,只需要@Blackbam給出的答案,並用正常的壓縮算法壓縮你的數據。這將不太奇怪。
另一個選項
最後,如果你不喜歡任何的上述建議,然後還有一個:溝PHP serialize()
一起。顯然它不適合你的需求。因此,最好提出一個非常適合您的需求的解決方案,然後嘗試修改完善的標準以適應您的問題。沿着這條路線將會給你一個不適合任何人的嵌合體。
這是什麼樣子?這取決於你的問題。例如,您可以在系統中爲類名建立一些縮寫。然後,當需要序列化時,可以創建一個包含縮寫類名的數組,以及需要保持的對象數據的字符串表示形式,以便重建它。然後找到一些編碼:它可能只是JSON,甚至PHP的序列化,或其他格式。然後,手動構建自己的unserialize()
方法,以從您自己的序列化表示中重建對象。基本上,製作你自己的serialize()
和unserialize()
。
@PeterFeatherstone不會讓它變長嗎? – Goose
您可以在序列化時修剪名稱空間/子名稱空間,然後在反序列化之前重新添加它,但我想這會是某種「WTF是這樣的***?!「,並且會阻止你的數據被其他服務/軟件輕易使用。 – NaeiKinDus
是的,但是如何做到這一點?睡眠或Serializable接口不會影響類名稱.... –