选择显示字体大小

php中的串行化变量和序列化对象(1)

     串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输、存储。当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构。
  
    在php中有多串行化处理的函数:serialize(),该函数把任何变量值(除了资源变量)转化为字符串的形式,可以把字符串保存到文件里,或者注册为session,乃至于使用curl来模拟get/post来传输变量,达到rpc的效果。
  
    如果要将串行化的变量转化成php原始的变量值,那么可以使用unserialize()函数。
  
    一、变量串行化
  
    我们举简单的例子来说明串行化,以及它的存储格式。
  
    整型:
  
    $var = 23;
    echo serialize($var);
  
    输出:
  
    i:23;
  
    浮点型:
  
    $var = 1.23;
  
    echo serialize($var);
  
    输出:
  
    d:1.229999999999999982236431605997495353221893310546875;
  
    字符串:
  
    $var = "this is a string";
    echo serialize($var);
    $var = "我是变量";
    echo serialize($var);
  
    输出:
  
    s:16:"this is a string";
    s:8:"我是变量";
  
    布尔型:
  
    $var = true;
    echo serialize($var);
    $var = false;
    echo serialize($var);
  
    输出:
  
    b:1;
    b:0;
  
    上面这些基本类型串行化之后的情况很清楚,串行化之后的存储格式是:
  
    变量类型:[变量长度:]变量值;
  
    就是第一位字符代表变量类型,第二个:代表分割,变量长度是可选的,就是在字符串类型里有,其他类型没有,最后一个就是变量值,每个串行化的值以";"作为结束。
  
    比如我们整型数字23串行化之后就是:i:23,那么它没有长度,只有类型和变量值,i代表integer,通过冒号分割,后面保存的是整型值23,包括浮点型(双字节型)也是一样。布尔型的话,类型是b(boolean),如果是true的话,那么串行化的值是1,如果是false那么值就是0。字
  
    符串值话中间会多一个保存的值得,保存字符串的长度值,比如字符串"this is a string",那么生成的串行化的值是 s:16:"this is a string"; s是string,代表类型,中间的16就是该字符串的长度,如果是中文的话,那么每个中文是两个字符来保存的,比如字符串 "我是变量",生成的串行化值是:s:8:"我是变量"; 就是8个字符的长度。
  
    下面我们重点来讲一下数组变量串行化。
  
    数组变量:
  
  $var = array("abc", "def", "xyz", "123");
  echo serialize($var);
  
    输出:
  
  a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz";i:3;s:3:"123";}
  
    就是把我的数组 $var 串行化得到的字符串值,我们的$var数组包括4个字符串元素,分别是"abc", "def", "xyz", "123",我们来分析一下串行化后的数据,为了简便起见,我们把串行化的数据列成数组的样式:
  
  a:4:
  {
  i:0;s:3:"abc";
  i:1;s:3:"def";
  i:2;s:3:"xyz";
  i:3;s:3:"123";
  }
  
    这样排列就比较清晰了,看开始的字符串:a:4:{...} 首先第一个字符a保存的是变量类型是array(数组)类型,第二个 4 保存的是数组元素的个数,一共有4个,然后在{}之间数组元素的内容。比如第一个数组元素:i:0;s:3:"abc"; i代表是当前数组元素的索引值类型是整型,并且值是 0,元素值的类型是s(字符串的),个数是 3 个,具体值是"abc",分号结束,下面的数组元素依次类推。
  
    我们再看看使用字符串做为元素索引会如何:
  
  $var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4"=>"123");
  echo serialize($var);
  
    输出:
  
  a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6:"index3";s:3:"xyz";s:6:"index4";s:3:"123";}
  
    变成数组样式后:
  
  a:4:
  {
   s:6:"index1";s:3:"abc";
   s:6:"index2";s:3:"def";
   s:6:"index3";s:3:"xyz";
   s:6:"index4";s:3:"123";
  }
  
    其实跟上面没有太大区别,不过是开始的索引变成了保存字符串的形式,比如第一个元素:s:6:"index1";s:3:"abc";第一项就是索引值:s:6:"index1"; s是类型,6是索引字符串的长度,"index1"就是索引的值。后面的s:3:"abc"; 就是元素值,这个好理解,就不讲了。
  
    从上面来看,我们大致了解了基本数据类型的串行化,其实我们完全可以构造自己的串行化功能,或者从这个角度去扩展,开发自己的串行化程序,便于我们的变量交换。
  
    当然,其实我们也可以利用这个功能,把数组或者任意其他变量串行化成字符串,然后通过curl功能来模拟get/post功能,达到能够无用用户执行动作就从远程服务器获取数据的功能。  


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons