2017-07-25 39 views
2

我有一組我需要序列化對象,但類名是長,例如:有沒有一種簡單的PHP方法來最小化序列化中的類名?

"\Namespace1\Subnamespace\dataobjectA" 
"\Namespace1\Subnamespace\dataobjectB" 
"\Namespace1\Subnamespace\dataobjectC" 
"\Namespace1\Subnamespace\dataobjectD" 

使用上的對象序列化功能,我得到: 「○:41:\」 Namespace1 \ Subnamespace \ dataobjectC \「:1:{s:4:」data「; s:9:」some data「;}」

序列化字符串包含有時比數據更大的完整類名:)

  • 我已經熟悉__sleep() ans __wakeup()函數,在這裏沒用。

  • 我明白,查找表的一些國王需要

我的問題是: 有一個簡單的PHP的方式,以儘量減少序列化的類名

任何建議,歡迎

+1

@PeterFeatherstone不會讓它變長嗎? – Goose

+0

您可以在序列化時修剪名稱空間/子名稱空間,然後在反序列化之前重新添加它,但我想這會是某種「WTF是這樣的***?!「,並且會阻止你的數據被其他服務/軟件輕易使用。 – NaeiKinDus

+0

是的,但是如何做到這一點?睡眠或Serializable接口不會影響類名稱.... –

回答

2

我有一個很好的答案,一個不好的答案,然後解決您的問題的答案。

很好的回答

如果我可以把這個地方是個完全:你可能真的不希望這樣做的。你提到類名有時比實際數據更長。如果是這種情況,那麼總體而言,序列化中幾乎沒有數據。除非你有一些可笑的長命名空間/類名(在這種情況下,你可能想重新考慮你的應用程序結構),我想你的序列化字符串將很容易適合,例如,MySQL文本字段。重點是,如果你只有一點點的數據,我真的懷疑用一種標準格式來削減少於一千字節的數據是值得的。任何合理的數據庫和服務器都將能夠毫無問題地處理這些事情,即使您擁有數百萬和數百萬個這樣的記錄。所以除非這是一種低內存的嵌入式設備,否則我會很好奇聽到你爲什麼認爲你需要這樣做(當然這是修辭:我認真地懷疑你是在嵌入式設備上運行PHP)。

如果嘗試做這樣的事情,你要補充一點,你將不得不保持每個人都會看着你,並說碼「什麼在世界上是怎麼回事? 」。它取決於你的需要,但我懷疑你更可能通過代碼來引入問題,這將使這個功能發生,而不是簡單地讓你的序列化數據變長。

不好回答

我真的不認爲你想將序列數據的任何變化。要直接回答你的問題之一:不,沒有辦法縮短命名空間,仍然使用PHP的unserialize()方法,除非在應用程序中完全拋棄命名空間。我真的懷疑你想這樣做。

您的其他選擇是手動調整序列化的字符串。然後你可以存儲這個「修改的序列化格式」(我們稱之爲​​)。然後,當你需要反序列化時,你必須扭轉你的modSerialized函數,並且可以正常運行unserialize()。這樣做的麻煩在於PHP的serialize方法的輸出代表了一種標準的並且完善的編碼。修改它本來就是容易出錯的,根據定義,它將違背標準的最佳實踐。如果你非常小心並且寫了很多代碼,你可以毫無問題地做到這一點,我認爲你不想這麼做。例如,你可以想象找到並替換\Namespace1\Subnamespace\dataobjectA與胡言亂語,因爲你想確保你不會意外地用你的字符串中實際發現的東西替換它。然後你必須記住你輸入的是什麼樣的亂碼,以及它代表什麼,所以你可以稍後改變它。如果你成功地做到了這一點,那麼新的!你只是重新發明了車輪,並建立了一個專門的壓縮算法!

真的,你也不想這樣做。或者如果你這樣做,只需要@Blackbam給出的答案,並用正常的壓縮算法壓縮你的數據。這將不太奇怪。

另一個選項

最後,如果你不喜歡任何的上述建議,然後還有一個:溝PHP serialize()一起。顯然它不適合你的需求。因此,最好提出一個非常適合您的需求的解決方案,然後嘗試修改完善的標準以適應您的問題。沿着這條路線將會給你一個不適合任何人的嵌合體。

這是什麼樣子?這取決於你的問題。例如,您可以在系統中爲類名建立一些縮寫。然後,當需要序列化時,可以創建一個包含縮寫類名的數組,以及需要保持的對象數據的字符串表示形式,以便重建它。然後找到一些編碼:它可能只是JSON,甚至PHP的序列化,或其他格式。然後,手動構建自己的unserialize()方法,以從您自己的序列化表示中重建對象。基本上,製作你自己的serialize()unserialize()

4

如果您擔心數據的長度,可以使用一些良好的壓縮功能對其進行壓縮。

這是一個工作示例:

class Tester { 
    public $name; 
    public $age; 
} 

$a = new Tester(); 

$a->name = "Harald the old Capttttttttttttain    is going to live very long."; 
$a->age = 999999999; 

$ser = serialize($a); 
var_dump($ser); 

$comp = gzcompress($ser,9); 

var_dump($comp); 

結果:

串(133) 「O:6:」 測試 「:2:{S:4:」 姓名「; S :75: 「哈拉爾老 Capttttttttttttain是要活得很長 」; S:3: 「年齡」;我:999999999;} 「

串(108)」 X2R 我-.IR2.2RKMU.27RH,JIQ(HU %H 13Od +克++ d ù끌4RJLieֵҺ(」

當然後者的是不人類可讀再也不會在數據庫搜索中使用,但它更短。

PHP bzcompress有不同的壓縮機制(http://php.net/manual/en/function.bzcompress.php)可能比gzcompress更好。

+0

我不認爲這會解決問題。'gzcompress'使用DEFLATE算法。該算法通過刪除重複項來減少空間使用量。命名空間在數據集中可能是獨一無二的,因此它之後不會更短。 –

+0

@MarvinRabe這就是爲什麼我寫了可能需要一個其他壓縮算法。即使是自定義壓縮算法也可能適用。 – Blackbam

相關問題