zoukankan      html  css  js  c++  java
  • 序列化与反序列化

    JS篇

    <script>
    	//js对象
    	function person(firstname,lastname,age,eyecolor)
    	{
    		this.firstname=firstname;
    		this.lastname=lastname;
    		this.age=age;
    		this.eyecolor=eyecolor;
    	}
    	//实例化js对象
    	myFather=new person("Bill","Gates",56,"blue");
    
    
    	//js对象的序列化
    	myJson = JSON.stringify(myFather);
    
    
    	//js对象的反序列化
    	//方法1:
    	/*
    	 * eval(string) 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
    	 *
    	 * eval()函数的问题是,它会将传入的字符串无差别的编译执行.如果从第三方服务器中获取
    	 * 的JSON数据被替换为了恶意脚本,那我们的站点就会无辜蒙冤,在访问者的浏览器中执行恶
    	 * 意代码.
    	 */
    	myObject1 = eval("(" + myJson + ")");
    
    	//方法2:
    	/*
    	 * JSON.parse() 方法用于将一个 JSON 字符串转换为对象。
    	 *
    	 * JSON.parse() 函数用来处理eval()函数暴露出的问题,该函数会解析JSON,但并不会执行脚本.
    	 * 这个函数也存在些问题,有些老旧版本的浏览器不支持这个函数,可能会导致我们的程序出错,因
    	 * 此,可以用一种比较优雅的方式进行规避,比如弹窗提醒用户升级自己浏览器到最新版本.
    	 */
    	myObject2 = JSON.parse(myJson);
    </script>
    

    PHP篇

    <?php
    	/*
    	 * PHP对JSON的序列化与反序列化也有内置的支持.这类操作在PHP中称为JSON的编码与解码.对某样
    	 * 东西进行编码的意思是将它转化为一种编码格式(即不可读的格式).解码的意思是将它转化为一种
    	 * 可读的格式.对PHP来说,JSON是一种编码格式.因此,序列JSON时应调用json_encode()函数,反
    	 * 序列化JSON时应调用json_decode()函数.
    	 */
    	class Account {
    		public $firstName;
    		public $lastName;
    		public $phone;
    		public $addresses;
    	}
    
    	class Address {
    		public $street;
    		public $city;
    		public $state;
    	}
    
    	$address1 = new Address();
    	$address1->street = '123';
    	$address1->city = '456';
    	$address1->state = '789';
    
    	$address2 = new Address();
    	$address2->street = 'abc';
    	$address2->city = 'def';
    	$address2->state = 'hij';
    
    	$account = new Account();
    	$account->firstName = 'song';
    	$account->lastName = 'ziqing';
    	$account->addresses = array($address1, $address2);
    
    	//序列化
    	$json = json_encode($account);
    
    	//反序列化
    	$obj = json_decode($json);
    ?>
    

    特别注意:
    经过json_decode()函数解码,返回的确是一个对象,但也只是一个对象,它不再是某个具体类的对象(如Account类),
    不再有Account类中存在,但经过解码后的对象中不存在的一些类中的方法.
    如果要将数据重塑为某个类(如Account类)对应的PHP对象,则必须采取一些措施,如下

    <?php
    /*
    	 * 如果要将数据重塑为某个类(如Account类)对应的PHP对象,则必须采取一些措施.
    	 *
    	 * 向Account类中添加一个新函数loadFromJSON,该函数会调用内置的json_decode()函数反序列化一个一般的PHP对象,然后在foreach
    	 * 循环中遍历该对象的属性,并赋值给Account对象中名称相同的属性.
    	 */
    	class Account {
    		public $firstName;
    		public $lastName;
    		public $phone;
    		public $addresses;
    
    		public function loadFormJSON($json) {
    			$object = json_decode($json);
    			foreach ($object as $name => $value) {
    				$this->{$name} = $value;
    			}
    		}
    	}
    
    	class Address {
    		public $street;
    		public $city;
    		public $state;
    	}
    
    	$address1 = new Address();
    	$address1->street = '123';
    	$address1->city = '456';
    	$address1->state = '789';
    
    	$address2 = new Address();
    	$address2->street = 'abc';
    	$address2->city = 'def';
    	$address2->state = 'hij';
    
    	$account = new Account();
    	$account->firstName = 'song';
    	$account->lastName = 'ziqing';
    	$account->addresses = array($address1, $address2);
    
    	//序列化
    	$json = json_encode($account);
    
    	//反序列化并转化为Account类的对象
    	$deserializedAccount = new Account();
    	$deserializedAccount -> loadFormJSON($json);
    	var_dump($deserializedAccount);
    ?>
    
  • 相关阅读:
    币值转换
    第八周作业
    第七周作业
    第五周编程总结
    第四周编程总结
    第三周编程总结
    7-1 查找整数
    7-2 求最大值及其下标
    秋季学习总结
    对我影响最大的三个老师
  • 原文地址:https://www.cnblogs.com/songziqing/p/6203442.html
Copyright © 2011-2022 走看看