我用php可以序列化对象的属性,但是却不能解序列化对象的属性,这是什么原因啊?有解决的方法吗?

解决方案 »

  1.   

    怎么加载对象的类定义啊?
    从数据库取出数据。
    $findAll=parent::select($this->_fields,array('where'=>array("a.id=b.proid AND a.id={$this->_R['id']}")));
    //此时需要反序列化字段info中的数据。
    $findAll[0]->info=unserialize($findAll[0]->info);然而却不能反序列化,返回false
      

  2.   

    我是这样处理的:
    php.ini中session.autostart=0//禁止在每个页面中使用
    class xx{};//类的定义
    session_start();对象不需要序列化和反序列化
      

  3.   


    比如:
    class Info{};//类的定义
    $obj=new Info();//创建对象
    d$=serialize( $obj ); //序列化对象
    update table  ...// 存入数据库表中
    -------------------
    取数据时:
    class Info{};//类的定义,可将类的定义单独放到一个文件中,然后require进来
    select info from table;//从数据表中取数据
    $val= (Info)unserialize( info ); // 反序列化
      

  4.   

    这就是我序列化的串:
    a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}问题是这个串却不能反序列化,因为这个串是存在数据库的,我调用的时候,是用对象的方式,去反序列化这个字段。
      

  5.   

    unserialize(): Error at offset 29 of 135 bytes in ???
    他是 utf-8 编码的,当做 gbk 就要出错!$s = 'a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}';
    $s = iconv('gbk', 'utf-8', $s);
    print_r(unserialize($s));Array
    (
        [3] => Array
            (
                [0] => 1-2台
                [1] => 1000元
            )    [4] => Array
            (
                [0] => 3-5台
                [1] => 1800元
            )    [5] => Array
            (
                [0] => 3-8台
                [1] => 2400元
            ))
      

  6.   


    public function findAll(){
    $this->_tables=array(DB_FREFIX.'goods a',DB_FREFIX.'goods_imgs b',DB_FREFIX.'brand c',DB_FREFIX.'nav d');
    $this->_fields=array('a.id','a.name','a.more','a.sn','a.inventory','sendaddress','price_sale','price_et','discount','keyword','thumbnail','content','c.name as brandname','c.url','d.name as navname');
    //array_push($this->_fields, 'p1small','p1big', 'p2small','p2big', 'p3small','p3big', 'p4small','p4big', 'p5small','p5big');
    $findData= parent::select($this->_fields,array('where'=>array("a.id=b.proid  AND a.nav=d.id AND a.id={$this->_R['id']}")));
    $findData[0]->okSale=rand(10,1000);
    $findData[0]->content=htmlspecialchars_decode($selectData[0]->content);
    $findData[0]->freight=DISCOUNT;
    $findData[0]->more=unserialize($findData[0]->more);//此时就无法解序列化了,more字段就是一个序列串。
    return $findData;
    }
      

  7.   

    echo $findData[0]->more;
    贴出结果
    只要数据格式是正确的,就不会解不开!
      

  8.   

    这就是结果:a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}
      

  9.   

    #13 不是已有示例了吗?
    格式说明:
    s:6:"1-2台" 中
    s 表示是字符串
    6 表示这个字符串的长度是 6
    "1-2台" 去掉两端的双引号就是字符串的内容了因为他指示的字符串长度为 6,所以这个序列化串原始的数据是 utf-8 的:1-2 长度是3,台 utf-8的长度是 3
    一共 6 个字节,如果原始数据是 gbk 的,那么长度就是 5 了
    如果你反序列化不成功,则表示你把 utf-8 的串转成了 gbk 的串了
      

  10.   

    NO,我贴出来的数据,是原始的数据,没有经过反序列化的,是直接从数据库中取出来的。
    如果我加unserialize($findData[0]->more);此时就是空的,也就是反序列化失败。
      

  11.   

    对呀!#18 的不就是序列化后的数据吗?要不你就再
    echo base64_encode($findData[0]->more);
    贴出结果
      

  12.   


    YTozOntpOjM7YToyOntpOjA7czo2OiZxdW90OzEtMuWPsCZxdW90OztpOjE7czo3OiZxdW90OzEwMDDlhYMmcXVvdDs7fWk6NDthOjI6e2k6MDtzOjY6JnF1b3Q7My015Y+wJnF1b3Q7O2k6MTtzOjc6JnF1b3Q7MTgwMOWFgyZxdW90Ozt9aTo1O2E6Mjp7aTowO3M6NjomcXVvdDszLTjlj7AmcXVvdDs7aToxO3M6NzomcXVvdDsyNDAw5YWDJnF1b3Q7O319此时的编码数据是直接从数据库中拿的序列化串,没有反序列化。
      

  13.   

    真奇怪,你们入库时为什么要做 html 转义呢?
    unserialize(html_entity_decode($findData[0]->more))
    就可以了你的数据base64解码后
    a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}html_entity_decode 后a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}
      

  14.   

    其实你早在 echo $findData[0]->more; 时就应该发现这个问题了
    只可惜,你只在浏览器中看了一下,却没有去看一下“网页源代码”