有時候需要把乙個物件在網路上傳輸,為了方便傳輸,可以把整個物件轉化為二進位制串,等到達另一端時,再還原為原來的物件,這個過程稱 之為序列 化,就像我們現在想把一輛汽車通過輪船運到美國去,因為汽車的體積比較大,我們可以把汽車拆開成小的部件,然後我們把這些部件通過輪般運到美國去,到了 美國再把這些部件組裝回汽車。
有兩種情況我們必須把物件序列化,第一種情況就是把乙個物件在網路中傳輸的時候要將物件序列化,第二種情況就是把物件寫入檔案或是資料庫的時候用到序列化。
序列化有兩個過程,乙個是序列化,就是把物件轉化為二進位制的字串,我們使用serialize()函式來序列化乙個物件,另乙個是反序列化,就是把物件轉化的二進位制字串再轉化為物件,我們使用unserialize()函式來反序列化乙個物件.
php中serialize()函式的引數為物件名,返回值為乙個字串,serialize()返回的字串含義模糊,一般我們不會解析這個串來得到物件的資訊,我們只要把返回來的這個字串傳到網路另一端或是儲存到方件中即可。
php中unserialize()函式來反序列化物件,這個函式的引數即為serialize()函式的返回值,輸出當然是重新組織好的物件.
<? class person //這個人可以說話的方法, 說出自己的屬性 function say() } $p1=new person("張三", "男", 20); $p1_string=serialize($p1); //把乙個物件序列化,返乙個字串 echo $p1_string."
"; //序列化的字串我們通常不去解析 $p2=unserialize($p1_string); //把乙個序列化的字串反序列化形成物件$p2 $p2->say(); ?>
上例輸出結果:
o:6:"person":3:
我的名子叫:張三性別:男我的年齡是:20
在php5中有兩個魔術方法__sleep()方法和__wakeup()方法,在物件序列化的時候,會呼叫乙個__sleep()方法來完成一些 睡前的事情;而在重新醒來,即由二進位制串重新組成乙個物件的時候,則會自動呼叫php的另乙個函式__wakeup(),做一些物件醒來就要做的動作。
__sleep()函式不接受任何引數,但返回乙個陣列,其中包含需要序列化的屬性。末被包含的屬性將在序列化時被忽略,如果沒有__sleep()方法,php將儲存所有屬性。
<? class person //這個人可以說話的方法, 說出自己的屬性 function say() //指定序列化時把返回的陣列中$name和$age值序列化,忽略沒在陣列中的屬性$*** function __sleep() //重新生成物件時,並重新賦值$age為40 function __wakeup() } $p1=new person("張三", "男", 20); //把乙個物件序列化,返乙個字串,呼叫了__sleep()方法,忽略沒在陣列中的屬性$*** $p1_string=serialize($p1); echo $p1_string."
"; //序列化的字串我們通常不去解析 $p2=unserialize($p1_string); //反序列化形成物件$p2重新賦值$age為40 $p2->say(); ?>
上例輸出值為:
o:6:"person":2:
我的名子叫:張三性別:我的年齡是:40
php物件導向 OOP 把物件序列化
有時候需要把乙個物件在網路上傳輸,為了方便傳輸,可以把整個物件轉化為二進位制串,等到達另一端時,再還原為原來的物件,這個過程稱之為序列化,就像我們現在想把一輛汽車通過輪船運到美國去,因為汽車的體積比較大,我們可以把汽車拆開成小的部件,然後我們把這些部件通過輪般運到美國去,到了美國再把這些部件組裝回汽...
物件序列化 反序列化
必須新增引用 using system.io using system.runtime.serialization using system.runtime.serialization.formatters.binary 方法 region 物件序列化 物件序列化 任意物件 字串 public st...
物件 序列化 反序列化
public class eventmessage 資訊提示類 型別1 操作日誌2 安全日誌 標題 內容 icon型別 url 執行script指令碼字串 需加 public static void messagebox int m type,string m title,string m body...