java/php 通用serialize/unserialize,序列与反序列化的问题

php的serialize/unserialize,方便把一个数组序列化和反序列化,但是要和java交互,就比较麻烦了。

java的serialize,序列化之后,会把java.util…包名都放进去了,而且格式也不同于php

对于汉字 php 占用2个字符,java占用一个字符,隐藏php序列化后,再由java 反序列化,可能导致乱码。

PHPSerializer 工具类可解决以上问题

目前版本目前实现了对各种基本类型、数组、ArrayList、HashMap、和其它可序列化对象的序列化。实现了 PHP 5 中的 Serializable 接口的支持。实现了 PHP 中的 __sleep 和 __wakeup 魔术方法的支持。实现了对所有标示(N、b、i、d、s、a、O、R、r、U、C)的反序列化,在对标示 a 反序列化时,可以根据下标和值来自动判断是 ArrayList 还是 HashMap。并且在反序列化时可以强制指定反序列化的类型。

该类是静态类,无需也不能被实例化。除了包含了 serialize 和 unserialize 方法以外,还增加了一个 cast 方法,用来进行反序列化后的类型转换,该方法主要用于将反序列化后的 ArrayList 转化为数组或者 HashMap。

该类在 J2SE SDK 1.3.1 和更高版本上编译通过,更低版本的未做测试。

package org.phprpc.util;

import java.util.HashMap;
import java.util.Map;

public class Test {
	public static void main(String[] args) {
		Map map= new HashMap();
		map.put("title", "这是标题1");
		map.put("title2", "这是标题2");
		map.put("title3", "这是标题3");
		map.put("title4", "这是标题4");
		byte[] b =PHPSerializer.serialize(map);
		System.out.println(new String(b));
		
		String str="a:4:{s:8:"fileName";s:53:"api_app/upload_Images/201211/22/1353546060_3801_1.png";s:8:"pic_size";i:155997;s:5:"width";i:480;s:6:"height";i:240;}";
		try {
			Map map2 =(Map)PHPSerializer.unserialize(str.getBytes());  //这是返回的map类型,用于处理以为数组
			
			//ArrayList array  = new ArrayList();
		    //array                 =  (ArrayList) PHPSerializer.unserialize(str.getBytes());//这是返回的ArrayList类型,用于处理多维数组
		    //在Idea中,str.getBytes(“utf-8”),需要带上utf-8,否则导致汉字乱码,因为不同编码,汉字的字符长度是不一样的,就可能导致解析错误。
			for (String s : map2.keySet()) {
				System.out.println("key:"+s+" 	 value:"+map2.get(s));
			}
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

说明一下,PHPSerializer.unserialize会根据序列化的实际内容,转换数据类型,所以上面的数据中有数字的,就被转换了。所以用Object比较保险。

package org.phprpc.util;
/* Serializable.java
*
* Author:       Ma Bingyao 
* Copyright:    CoolCode.CN
* Version:      2.1
* LastModified: 2006-08-09
* This library is free.  You can redistribute it and/or modify it.
* http://www.coolcode.cn/?p=202
* http://www.coolcode.org/?action=show&id=202
*/
interface Serializable {
    byte[] serialize();
    void unserialize(byte[] ss);
}

这个工具类需要phprpc jar包支持,maven导入包:

org.sction
phprpc
3.0.2

转载地址:https://www.cjblog.org/blog/1356591438758

你可能感兴趣的:(php,java)