序列化与反序列化

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);
?>
posted @ 2016-12-20 17:22  宋子庆  阅读(244)  评论(0编辑  收藏  举报