物件的儲存和還原之序列化,反序列化

2021-09-08 14:04:32 字數 3177 閱讀 9565

一: 背景

二: 物件的儲存之序列化

三: 物件的還原之反序列化

四: 序列化和反序列化在cookie中的應用

在使用資料庫操作類的時候,只想例項化一次,後面把物件儲存在檔案中,在要用到資料庫操作類的物件的地方,直接從檔案中讀取物件;

1.eg:

<?php

//過載

class person

}$p = new person();

var_dump($p);

效果:

object(person)#1 (3)
2.file_put_contents不能把物件寫入檔案,只能寫入乙個字串

int file_put_contents( string $filename, mixed $data[, int $flags = 0[, resource $context]] )
3.解決方案:可以把物件轉換為乙個字串,想保證物件結構的完整性,也即轉變為字串的時候不會因為資料型別的改變而把物件的性質變了;

4.序列化serialize: 可以將復合資料型別,保留其原有的屬性或者結構,來轉換成乙個序列化後的字串

string serialize( mixed $value)
<?php

//物件的儲存:序列化

class person

}$p = new person();

//物件轉換為字串

$p=serialize($p);

/*** var_dump($p);

* string(91) "o:6:"person":3:"

*///把物件寫入到同級目錄obj.txt檔案中

if(file_put_contents('obj.txt',$p))

else

obj檔案內容:

4f3a 363a 2250 6572 736f 6e22 3a33 3a7b

733a 343a 226e 616d 6522 3b73 3a36 3a22

e5bc a0e4 b889 223b 733a 363a 2200 2a00

7365 7822 3b73 3a33 3a22 e794 b722 3b73

3a31 333a 2200 5065 7273 6f6e 006d 6f6e

6579 223b 693a 3230 303b 7d

1.從檔案中讀出物件所儲存的內容

file_get_contents — 將整個檔案讀入乙個字串

string file_get_contents( string $filename[, 

bool $use_include_path = false[,

resource $context[,

int $offset = -1[, int $maxlen]]]] )

2.反序列化unserialize  

mixed unserialize( string $str)
=>unserialize — 從已儲存的表示中建立 php 的值;

=>unserialize()對單一的已序列化的變數進行操作,將其轉換回 php 的值;

=>可以把原來儲存在檔案中的內容按其序列化前結構原樣輸出;

=>反序列化,得到物件,是乙個php不完整類(基類)的乙個物件;

=>要想得到之前的person類的物件,必須保證person類在記憶體中存在;

=>由於之前儲存的是哪個類的物件不確定,所以可以使用自動載入函式來完成;

=>獲得的物件跟之前的物件(資源屬性被改變了)不一致;

=>由於序列化後資料庫的連線資源被強制轉換為整型,反序列後得到的物件連線資源依然是整型,而資料庫的操作必須是建立在連線資源存在的情況下。

<?php

//從檔案中讀取該物件

$str=file_get_contents('obj.txt');

//o:6:"person":3:

//自動載入機制

function __autoload($class)

.class.php"))

.class.php";

}}

//把字串重新轉換為物件

$obj=unserialize($str);

var_dump($obj);

//要使用物件,必須保證該類在記憶體中存在

效果:

object(__php_incomplete_class)#1 (4)
在cookie無法儲存陣列

解決方法:

1.把復合資料型別陣列轉換為字串,儲存在cookie中,使用序列化;

2.重新把字串轉換成陣列,進行反序列化處理

另外一種方式解決陣列轉換為字串

1. json_encode(陣列): 把陣列轉換為json格式的字串;

2. json_decode(json格式的字串,[true/false]): 把json格式的字串轉換為物件(可以沒有);

<?php

//解決cookie無法存陣列的問題

$arr=[

['good_id'=>1,'goods_num'=>100],

['good_id'=>1,'goods_num'=>100]

];//把陣列轉換為字串存到cookie中

//第一種 json_encode()

//$cart=json_encode($arr);

$cart=serialize($arr);

setcookie('cart',$cart,time()+3600);

//var_dump($_cookie);

//$cart=json_decode($_cookie['cart'],true);

$cart=unserialize($_cookie['cart']);

var_dump($cart);

物件序列化和反序列化

物件序列化有很多方式,在這裡我只講用xml序列化,我們從開始序列化講起,首先,你要在需要被序列化的類前面寫上 serializable 表示該類的例項可以被序列化,其次在要執行序列化的 去中寫入using system.xml.serialization xml序列化必須的 using system...

物件序列化和反序列化

c 提供三種序列化的方法,與此有關的三個類分別是 binaryserialize soapserialize xmlserialize 以二進位制的序列化和反序列化為例,先建立乙個實體類product。1 serializable 2public class product316 17public ...

物件的序列化和反序列化

default.aspx page language c autoeventwireup true codebehind default.aspx.cs inherits doctype html public w3c dtd xhtml 1.0 transitional en html xmlns...