為你剖解PHP序列化格式_PHP教程

來源:互聯網
上載者:User
對於那些剛剛接觸PHP (從 PHP 3.05 開始)為儲存對象提供了一組序列化和還原序列化的函數:serialize、unserialize。不過在 PHP 手冊中對這兩個函數的說明僅限於如何使用,而對序列化結果的格式卻沒做任何說明。

因此,這對在其他語言中實現PHP序列化格式來說,就比較麻煩了。雖然以前也搜集了一些其他語言實現的 PHP 序列化的程式,不過這些實現都不完全,當序列化或還原序列化一些比較複雜的對象時,就會出錯了。

於是我決定寫一份關於PHP序列化格式詳解的文檔(也就是這一篇文檔),以便在編寫其他語言實現的 php 序列化程式時能有一個比較完整的參考。

這篇文章中所寫的內容是我通過編寫程式測試和閱讀 PHP 原始碼得到的,所以,我不能 100% 保證所有的內容都是正確的,不過我會盡量保證我所寫下的內容的正確性,對於我還不太清楚的地方,我會在文中明確指出,也希望大家能夠給予補充和完善。

PHP序列化格式後的內容是簡單的文字格式設定,但是對字母大小寫和空白(空格、斷行符號、換行等)敏感,而且字串是按照位元組(或者說是 8 位的字元)計算的,因此,更合適的說法是 PHP 序列化後的內容是位元組流格式。

因此用其他語言實現時,如果所實現的語言中的字串不是位元組儲存格式,而是 Unicode 儲存格式的話,序列化後的內容不適合儲存為字串,而應儲存為位元組流對象或者位元組數組,否則在與 PHP 進行資料交換時會產生錯誤。

PHP 對不同類型的資料用不同的字母進行標示,Yahoo 開發網站提供的 Using Serialized PHP with Yahoo! Web Services 一文中給出所有的字母標示及其含義:

a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string

N 表示的是 NULL,而 b、d、i、s 表示的是四種標量類型,目前其它語言所實現的PHP序列化格式程式基本上都實現了對這些類型的序列化和還原序列化,不過有一些實現中對 s (字串)的實現存在問題。

a、O 屬於最常用的複合類型,大部分其他語言的實現都很好的實現了對 a 的序列化和還原序列化,但對 O 只實現了 PHP4 中對象序列化格式,而沒有提供對 PHP 5 中擴充的對象序列化格式的支援。

r、R 分別表示對象引用和指標引用,這兩個也比較有用,在序列化比較複雜的數組和對象時就會產生帶有這兩個標示的資料,後面我們將詳細講解這兩個標示,目前這兩個標示尚沒有發現有其他語言的實現。

C 是 PHP5 中引入的,它表示自訂的對象序列化方式,儘管這對於其它語言來說是沒有必要實現的,因為很少會用到它,但是後面還是會對它進行詳細講解的。

U 是 PHP6 中才引入的,它表示 Unicode 編碼的字串。因為 PHP6 中提供了 Unicode 方式儲存字串的能力,因此它提供了這種PHP序列化格式字串的格式,不過這個類型 PHP5、PHP4 都不支援,而這兩個版本目前是主流,因此在其它語言實現該類型時,不推薦用它來進行序列化,不過可以實現它的還原序列化過程。在後面我也會對它的格式進行說明。

最後還有一個 o,這也是我唯一還沒弄清楚的一個資料類型標示。這個標示在 PHP3 中被引入用來序列化對象,但是到了 PHP4 以後就被 O 取代了。在 PHP3 的原始碼中可以看到對 o 的序列化和還原序列化與數組 a 基本上是一樣的。但是在 PHP4、PHP5 和 PHP6 的原始碼中PHP序列化格式部分裡都找不到它的影子,但是在這幾個版本的還原序列化程式原始碼中卻都有對它的處理,不過把它處理成什麼我還沒弄清楚。因此對它暫時不再作更多說明了。


http://www.bkjia.com/PHPjc/446212.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/446212.htmlTechArticle對於那些剛剛接觸 PHP (從 PHP 3.05 開始)為儲存對象提供了一組序列化和還原序列化的函數:serialize、unserialize。不過在 PHP 手冊中對這兩個函...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.