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