java中把对象序列化成php序列化的字符串以及把php序列化的字符串反序列化为java对象的方法

依赖第三方库 phprpc

序列化成php格式的字符串很简单,直接调用 org.phprpc.util.PHPSerializer.serializer方法就行,有问题的是反序列化php格式的字符串为List或Map对象时,得到的是个

AssocArray对象,需要写方法进行转换。通过下面这个方法可以实现转为java对象。
  public static Object phpUnserialize(String s) {
        Object rtn = null;
        try {
            AssocArray aa = (AssocArray) ps.unserialize(s.getBytes(CharEncoding.UTF_8));
            rtn = transfer(aa);
        }catch (Exception e){
            e.printStackTrace();
        }
        return rtn;
    }
    private static Object transfer(Object o){
        Object rtn = null;
        if(o instanceof AssocArray) {
            AssocArray aa = (AssocArray) o;
            List l  = aa.toArrayList();
            if(l==null || l.size()==0){
                Map m = aa.toHashMap();
                rtn = transfer(m);
            }else{
                rtn = transfer(l);
            }
        }else if(o instanceof Map){
            Map m = (Map<?, ?>) o;
            for(Object key:m.keySet()){
                Object v = m.get(key);
                if(v instanceof AssocArray){
                    v = transfer(v);
                    m.put(key,v);
                } else if (v instanceof byte[]) {
                    m.put(key,new String(((byte[])v)));
                }
            }
            rtn = m;
        } else if (o instanceof List) {
            List l = (List) o;
            List newL = new ArrayList();
            for(int i=0;i<l.size();i++){
                Object o1 = l.get(i);
                o1 = transfer(o1);
                newL.add(o1);
            }
            rtn = newL;
        } else if(o instanceof byte[]){
            rtn = new String(((byte[])o));
        }else {
            rtn = o;
        }
        return rtn;
    }

 

posted @ 2023-05-19 16:22  zk1  阅读(176)  评论(0编辑  收藏  举报