2012-12-27 14:57:18  浏览:3811

java serialize unserialize

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

 

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

 

这个版本目前实现了对各种基本类型、数组、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());
			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比较保险。

 

下面是coolcode的处理类

Serializable.java

 

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);
}

 

 

PHPSerializer.java

点击下载


 

返回首页