XStream转换Object生成类结构垃圾数据太多了,影响网络,仿照之前的JSON工具类的写法,自己又写了个转换到仅HashMap和ArrayList容器的类来做一下处理。
思路主要就是把Bean的成员转换到HashMap,而Colecction和数组类型转换到ArrayList。这下除了原始类型外,就只包含HashMap和ArrayList两个JAVA类了。
这样做转换处理后,再用XStream做一下转换成的数据。。。哇,这下世界清洁多了:)
package
com.aherp.framework.util;

import
java.lang.reflect.Array;
import
java.lang.reflect.Method;
import
java.util.ArrayList;
import
java.util.Collection;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;

import
org.json.JSONException;


/***/
/**
*转换工具类,支持反射的方式将对象转换为Map,将数组和Collection转换为List供XStrem使用
*@authorJimWu
*
*/

public
class
ObjMapListUtil
...
{

privatestaticObjMapListUtilinstance=null;


staticpublicObjecttoHashMap(Objectobj)throwsJSONException...{
returntoHashMap(obj,false);
}


staticpublicObjecttoHashMap(Objectobj,booleanuseClassConvert)throwsJSONException...{
if(instance==null)
instance=newObjMapListUtil();
returninstance.getMapListObject(obj,useClassConvert);
}


/***//**
*代理类是否输出的检查,返回true则允许继续转换
*@parambean
*@return
*/

protectedbooleancanProxyOutput(Objectbean)...{
returntrue;
}


/***//**
*代理类时做的检查.返回应该检查的对象.
*@parambean
*@return
*/

protectedObjectproxyConvert(Objectbean)...{
returnbean;
}


publicObjectgetMapListObject(Objectbean,booleanuseClassConvert)...{

if(bean==null)
returnnull;
bean=proxyConvert(bean);
Classclazz=bean.getClass();

if(beaninstanceofNumber||beaninstanceofBoolean||beaninstanceofString)...{
returnbean;
}

if(clazz.isArray())...{

ArrayList<Object>arrayList=newArrayList<Object>();

intarrayLength=Array.getLength(bean);

for(inti=0;i<arrayLength;i++)...{
ObjectrowObj=Array.get(bean,i);
if(canProxyOutput(rowObj))
arrayList.add(getMapListObject(rowObj,useClassConvert));
}
returnarrayList;
}

if(beaninstanceofCollection)...{

ArrayList<Object>arrayList=newArrayList<Object>();

Iteratoriterator=((Collection)bean).iterator();

while(iterator.hasNext())...{
ObjectrowObj=iterator.next();
if(canProxyOutput(rowObj))
arrayList.add(getMapListObject(rowObj,useClassConvert));
}
returnarrayList;
}

if(beaninstanceofMap)...{
HashMap<String,Object>beanMap=newHashMap<String,Object>();

Mapmap=(Map)bean;
Iteratoriterator=map.keySet().iterator();

while(iterator.hasNext())...{
Objectkey=iterator.next();
ObjectrowObj=map.get(key);
if(canProxyOutput(rowObj))
beanMap.put(key.toString(),getMapListObject(rowObj,useClassConvert));
}
returnbeanMap;
}

HashMap<String,Object>beanMap=newHashMap<String,Object>();
Classklass=bean.getClass();
Method[]methods=klass.getMethods();

for(inti=0;i<methods.length;i++)...{

try...{
Methodmethod=methods[i];
Stringname=method.getName();
Stringkey="";

if(name.startsWith("get"))...{
key=name.substring(3);

}elseif(name.startsWith("is"))...{
key=name.substring(2);
}
if(key.length()>0&&
Character.isUpperCase(key.charAt(0))&&

method.getParameterTypes().length==0)...{

if(key.length()==1)...{
key=key.toLowerCase();

}elseif(!Character.isUpperCase(key.charAt(1)))...{
key=key.substring(0,1).toLowerCase()+
key.substring(1);
}
ObjectelementObj=method.invoke(bean);

if(elementObjinstanceofClass)...{
if(useClassConvert)
beanMap.put(key,elementObj.toString());
}

else...{
if(canProxyOutput(elementObj))
beanMap.put(key,getMapListObject(elementObj,useClassConvert));
}
}

}catch(Exceptione)...{

/**//*forgetaboutit*/
}
}
returnbeanMap;
}


}
支持Hibernate的类则继承一下,覆盖proxyConvert和canProxyOutput方法
package
com.aherp.framework.util;

import
org.hibernate.collection.PersistentSet;
import
org.hibernate.proxy.HibernateProxy;
import
org.hibernate.proxy.LazyInitializer;
import
org.json.JSONException;


/***/
/**
*扩展为支持Hibernate的工具方法.
*@authorJimWu
*
*/

public
class
HiObjMapListUtil
extends
ObjMapListUtil
...
{

privatestaticHiObjMapListUtilinstance=null;


staticpublicObjecttoHashMap(Objectobj)throwsJSONException...{
returntoHashMap(obj,false);
}


staticpublicObjecttoHashMap(Objectobj,booleanuseClassConvert)throwsJSONException...{
if(instance==null)
instance=newHiObjMapListUtil();
returninstance.getMapListObject(obj,useClassConvert);
}

@Override

protectedObjectproxyConvert(Objectbean)...{

if(beaninstanceofHibernateProxy)...{
LazyInitializerlazyInitializer=((HibernateProxy)bean).getHibernateLazyInitializer();

if(lazyInitializer.isUninitialized())...{
returnlazyInitializer.getIdentifier();
}else
returnlazyInitializer.getImplementation();
}

if(beaninstanceofPersistentSet)...{

returnnewString[]...{};//忽略hibernateone-to-many
}
returnbean;
}

@Override

protectedbooleancanProxyOutput(Objectbean)...{
return!(bean!=null&&beaninstanceofPersistentSet);
}
}
P.S.发现Hibernate Session的get方法拿到的对象仅填充了一个OID而已,需要Hibernate.initialize才能继续拿到整个实体的数据。这样XStream转换才正确,否则就是一个仅OID的List而已了
思路主要就是把Bean的成员转换到HashMap,而Colecction和数组类型转换到ArrayList。这下除了原始类型外,就只包含HashMap和ArrayList两个JAVA类了。
这样做转换处理后,再用XStream做一下转换成的数据。。。哇,这下世界清洁多了:)





































































































































































支持Hibernate的类则继承一下,覆盖proxyConvert和canProxyOutput方法

























































P.S.发现Hibernate Session的get方法拿到的对象仅填充了一个OID而已,需要Hibernate.initialize才能继续拿到整个实体的数据。这样XStream转换才正确,否则就是一个仅OID的List而已了