ano*_*ery 4 java performance android deserialization simple-framework
提出了赏金,因为唯一的答案并没有为Android提供良好的实现.是否有与Android兼容的更快速的实现?或者SimpleXML是我得到的最佳性能?
我是Java和Android开发的新手,因此不知道将xml字符串反序列化为对象的正确过程.我发现了一种适用于的方法:
public static Object deserializeXMLToObject(String xmlFile,Object objClass) throws Exception
{
try
{
InputStream stream = new ByteArrayInputStream(xmlFile.getBytes("UTF-8"));
Serializer serializer = new Persister();
objClass = serializer.read(objClass, stream);
return objClass;
}
catch (Exception e)
{
return e;
}
}
Run Code Online (Sandbox Code Playgroud)
xmlFile(错误命名的)xml字符串在哪里,并且objClass是我想要反序列化的类的空类.这通常是其他对象的列表.
示例类:
@Root(name="DepartmentList")
public class DepartmentList {
@ElementList(entry="Department", inline=true)
public List<Department> DepartmentList =new ArrayList<Department>();
public boolean FinishedPopulating = false;
}
Run Code Online (Sandbox Code Playgroud)
系类:
public class Department {
@Element(name="DeptID")
private String _DeptID ="";
public String DeptID()
{
return _DeptID;
}
public void DeptID(String Value)
{
_DeptID = Value;
}
@Element(name="DeptDescription")
private String _DeptDescription ="";
public String DeptDescription()
{
return _DeptDescription;
}
public void DeptDescription(String Value)
{
_DeptDescription = Value;
}
}
Run Code Online (Sandbox Code Playgroud)
示例XML:
<DepartmentList>
<Department>
<DeptID>525</DeptID>
<DeptDescription>Dept 1</DeptDescription>
</Department>
<Department>
<DeptID>382</DeptID>
<DeptDescription>Dept 2</DeptDescription>
</Department>
</DepartmentList>
Run Code Online (Sandbox Code Playgroud)
这在整个应用程序中都运行良好,但我已经到了需要在列表中反序列化> 300个对象的点.这只需要大约5秒,或者在调试时接近一分钟,但是当不希望进行调试时,用户对该性能和浪费的时间不满意.有什么方法可以加快速度吗?或者我还有另一种方法吗?优选仅通过改变deserializeXMLToObject方法.
我相信有人会指出一个更好的图书馆,但根据一个详细的答案,他们在Android上都很慢.
所以这是我的快速黑客(是的,我知道它不是非常可维护,并且对于XML没有完全按照指定形成而脆弱)并且有一些结果:
private void doTest()
{
Thread t = new Thread()
{
public void run()
{
runOne(2000);
runOne(300);
runOne(20000);
}
private void runOne(int num)
{
String start = "<DepartmentList>";
String mid1 = "<Department>\n" +
"<DeptID>";
String mid2 = "</DeptID>\n" +
"<DeptDescription>Dept ";
String mid3 = "</DeptDescription></Department>";
String fin = "</DepartmentList>";
StringBuffer sb = new StringBuffer();
sb.append(start);
for (int i=0; i< num; i++)
{
sb.append(mid1);
sb.append(""+i);
sb.append(mid2);
sb.append(""+i);
sb.append(mid3);
}
sb.append(fin);
Pattern p = Pattern.compile(
"<Department\\s*>\\s*<DeptID\\s*>([^<]*)</DeptID>\\s*<DeptDescription\\s*>([^<]*)</DeptDescription>\\s*</Department>");
long startN = System.currentTimeMillis();
DepartmentList d = new DepartmentList();
List<Department> departments = d.DepartmentList;
Matcher m = p.matcher(sb);
while (m.find())
{
Department department = new Department();
department.DeptID(m.group(1));
department.DeptDescription(m.group(2));
departments.add(department);
}
long endN = System.currentTimeMillis();
Log.d("Departments", "parsed: " + departments.size() + " in " + (endN-startN) + " millis");
Log.d("Departments", "lastone: " + departments.get(departments.size() -1)._DeptID + " desc: " + departments.get(departments.size() -1)._DeptDescription);
}
};
t.start();
}
public class DepartmentList {
public List<Department> DepartmentList =new ArrayList<Department>();
public boolean FinishedPopulating = false;
}
public class Department {
private String _DeptID ="";
public String DeptID()
{
return _DeptID;
}
public void DeptID(String Value)
{
_DeptID = Value;
}
private String _DeptDescription ="";
public String DeptDescription()
{
return _DeptDescription;
}
public void DeptDescription(String Value)
{
_DeptDescription = Value;
}
}
Run Code Online (Sandbox Code Playgroud)
我将其粘贴到Android项目中,并从onCreate()方法调用它.结果如下:
Platform num=300 num=2000 num=20000
=================================================
Nexus 7 5 38 355
Galaxy Y 29 430 1173
HTC Desire HD 19 189 539
Galaxy Nexus 14 75 379
Run Code Online (Sandbox Code Playgroud)
所有时间都以毫秒为单位.
| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |