Иван [XC]
Guest
Решение проблемы с SERIALIZE
Возникла у меня проблема с SERIALIZE , а точнее понравилось мне хранить обьекты на слове, а SERIALIZE , блин, глючит - если мои внутренние переменные класса или масива содердат кавычки и регулярные выражения.
Конечно SERIALIZE - работал хорошо, но вот потом развернуть их unserialize было не возможно
И вот не долго думая сажусь и пишу класс, который конвертит объекты в строки и строки в объекты. Привожу код, может кому и понадобится:
Возникла у меня проблема с SERIALIZE , а точнее понравилось мне хранить обьекты на слове, а SERIALIZE , блин, глючит - если мои внутренние переменные класса или масива содердат кавычки и регулярные выражения.
Конечно SERIALIZE - работал хорошо, но вот потом развернуть их unserialize было не возможно

И вот не долго думая сажусь и пишу класс, который конвертит объекты в строки и строки в объекты. Привожу код, может кому и понадобится:
PHP:
<?php
if(!defined('SERIALIZE_INC')){
// так как Serialize в php глючит - наисал свой класс Serialize
class Serialize{
function Serialize(){
return true;
}
function Obj2Str(&$Object){
$this->split = 0;
$this->result = $this->parse(&$Object,0);
$this->count = strlen($this->result);
$this->gcount = strlen(gzencode($this->result));
return $this->result;
}
function Str2Obj($str,&$Object){
$this->object = &$Object;
$this->decode($str,&$Object);
return true;
}
function decode($str,&$Object){
if(preg_match('/([ac]):(\d+):{(.*)}$/',$str,$res)){
if($res[1]=='a') return $this->decode_array($res[3],$res[2],&$Object);
if($res[1]=='c') return $this->decode_class($res[3],$res[2],&$Object);
}
$Object = base64_decode($str);
return true;
}
function decode_array($str,$split,&$Object){
$Object = array();
$res = preg_split("/(key$split)|(val$split)/i",$str);
if(is_array($res))
for($i=1;$i<count($res);$i+=2){
$this->decode($res[$i],&$key);
$this->decode($res[$i+1],&$val);
$Object[$key] = $val;
}
return true;
}
function decode_class($str,$split,&$Object){
if(!preg_match('/class:{(.*?})(.*)/i',$str,$res)) return true;
$ClassName = preg_replace('/}$/i','',$res[1]);
if($ClassName!='stdClass')
if($this->object!=$Object)
$Object = & new $ClassName();
$res = preg_split("/(name$split)|(value$split)/i",$str);
if(is_array($res))
for($i=1;$i<count($res);$i+=2){
$this->decode($res[$i],&$key);
$this->decode($res[$i+1],&$val);
$Object->$key = $val;
}
return true;
}
function parse(&$Object,$split){
if(is_array($Object)) return $this->parce_array(&$Object,$split);
if(is_object($Object)) return $this->parce_object(&$Object,$split);
if(is_bool($Object)) $Object = $Object ? 1 : 0;
return base64_encode($Object);
}
function parce_array(&$Object,$split){
$ret = '{a:' . $split . ':{';
foreach($Object as $key => $val){
$ret_key = $this->parse(&$key, $split+1);
$ret_val = $this->parse(&$val, $split+1);
$ret .= 'key' . $split . $ret_key . 'val' . $split . $ret_val ;
}
return $ret . '}';
}
function parce_object(&$Object,$split){
$ret = 'c:' . $split . ':{class:{' . get_class($Object) . '}';
foreach($Object as $key => $val){
$ret_key = $this->parse(&$key, $split+1);
$ret_val = $this->parse(&$val, $split+1);
$ret .= 'name' . $split . $ret_key . 'value' . $split . $ret_val;
}
return $ret . '}';
}
}
define('SERIALIZE_INC',true);
$Serialize = & new Serialize();
}
?>