Решение проблемы с SERIALIZE

  • Автор темы Иван [XC]
  • Дата начала

Иван [XC]

Guest
Решение проблемы с SERIALIZE

Возникла у меня проблема с SERIALIZE , а точнее понравилось мне хранить обьекты на слове, а SERIALIZE , блин, глючит - если мои внутренние переменные класса или масива содердат кавычки и регулярные выражения.

Конечно SERIALIZE - работал хорошо, но вот потом развернуть их unserialize было не возможно :mad:

И вот не долго думая сажусь и пишу класс, который конвертит объекты в строки и строки в объекты. Привожу код, может кому и понадобится:

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();

}


?>
 

tony2001

TeaM PHPClub
можно еще увидеть демонстрацию "глюков".
я буду очень благодарен.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Да, что-то я не припомню, чтобы serialize глючил
 

Иван [XC]

Guest
Автор оригинала: Фанат
varan
ну как же

вот тебе и глюки.
Просто никто не сталкивался с проблемой : вот класс

PHP:
array
  'edit_robot' => '50'
  'rul_id' => ''
  'step' => ''
  'baseurl' => 'http://osc.atpi/'
  'level' => '10'
  'max_pages' => ''
  'up_level' => 'on'
  'is_clear_url' => 'on'
  'is_clear_url_text' => '/(&|\?)osCsid.*$/i'
  'is_item' => 'off'
  'is_list' => 'off'
  'is_html' => 'on'
  'rul_html' => '/.*/i'
  'is_url' => 'off'
  'rul_url' => ''
  'is_ereg' => 'on'
  'is_slash' => 'off'
  'test_url' => 'http://osc.atpi/index.php?cPath=3_10'
  'is_test' => 'on'
  'is_smart' => 'off'
  'url_level' => '0'
  'html_ob' => 
    array
      1 => 'on'
  'html_de' => 
    array
      1 => 'off'
  'LINK_RULES' => 
    array
      0 => 
        object(stdClass)
          'test_url' => 'http://osc.atpi/index.php'
          'LinkRule' => 'c:0:{class:{linkrule}name0cGFyYW1zvalue0{a:1:{key1aHRtbA==val1{a:2:{key2YWN0aXZlval2MQ==key2a2V5val2{a:3:{key3MA==val3aW5kZXgucGhw}key2cHJlZw==val2Ly4qL2k=key2b2I=val2{a:3:{key3MA==val3MQ==}key2ZGU=val2{a:3:{key3MA==val3MA==}}key1dXJpval1{a:2:{key2YWN0aXZlval2MA==key2a2V5val2{a:3:{}key2cHJlZw==val2key2b2I=val2{a:3:{key3MA==val3MA==}key2ZGU=val2{a:3:{key3MA==val3MA==}}key1ZXJlZw==val1{a:2:{key2YWN0aXZlval2MA==key2a2V5val2{a:3:{key3MA==val3}key2cHJlZw==val2key2b2I=val2{a:3:{key3MA==val3MA==}key2ZGU=val2{a:3:{key3MA==val3MA==}}key1c2xhc2g=val1{a:2:{key2YWN0aXZlval2MA==key2a2V5val2{a:3:{key3MA==val3aW5kZXgucGhw}key2cHJlZw==val2key2b2I=val2{a:3:{key3MA==val3MA==}key2ZGU=val2{a:3:{key3MA==val3MA==}}}}'
          'level_url' => '0'
          'is_list' => false
          'is_item' => false
          'is_smart' => false
  'rul_count' => 1
  'ereg_ob' => 
    array
      1 => 'on'
  'ereg_de' => 
    array
      1 => 'off'
  'action' => '4'
 

Tor

Новичок
у кого-то дойдут руки проверить на кавычках или так и будем, э, фигней заниматься
 

Иван [XC]

Guest
Автор оригинала: Фанат
чудовищно.
Что именно?

-~{}~ 01.06.05 18:45:

Автор оригинала: Tor
у кого-то дойдут руки проверить на кавычках или так и будем, э, фигней заниматься
Суть в том что КАВЫЧКИ НУЖНЫ и все остальное что НЕЛЬЗЯ и НЕПОДХОДИТ!!!
 

Фанат

oncle terrible
Команда форума
Tor, если ты найдёшь человека, готового на практике изучать результат умножения 2х2 - милости просим.

Иван [XC]
то, что не зная элементарных вещей, ты накатал целый класс, вместо того, чтобы использховать одну-единственную функцию
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
да еще и в этом доморощенном никому не нужном классе почему-то фигурирует
<img src="images/smilies/frown.gif" border="0" alt="">

Видимо для сериализации это крайне необходимый элемент:)
 

Найч

Алгоритмик :-)
Фанат как всегда говорит, но не поясняет :)
varan
это результат работы этого форума
 

Иван [XC]

Guest
Автор оригинала: Фанат
Tor, если ты найдёшь человека, готового на практике изучать результат умножения 2х2 - милости просим.

Иван [XC]
то, что не зная элементарных вещей, ты накатал целый класс, вместо того, чтобы использховать одну-единственную функцию
Если я не прав - могу это признать !
Какая функция?
 

Фанат

oncle terrible
Команда форума
поищи причину "проблем" сериалайза самостоятельно.
Для этого тебе понадобится структура данных попроще, чем твоя, желательно, из одной строки с кавычкой, и глаза.
 

Иван [XC]

Guest
Автор оригинала: Фанат
поищи причину "проблем" сериалайза самостоятельно.
Для этого тебе понадобится структура данных попроще, чем твоя, желательно, из одной строки с кавычкой, и глаза.
Я БЫЛ НЕ ПРАВ!

Спасибо

http://php.paco.net/manual/ru/function.serialize.php
 
Сверху