使用SimpleXML进行反序列化的Android速度问题

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方法.

hac*_*_on 6

我相信有人会指出一个更好的图书馆,但根据一个详细的答案,他们在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)

所有时间都以毫秒为单位.