使用“简单”XML序列化从Android上的res / raw加载数据

时间:2010-12-20 10:14:47

标签: java android xml eclipse simple-framework

我是Java和Android开发的新手,所以请记住这一点。我的目标是从打包到我的应用程序中的xml文件反序列化数据。我试图使用Simple 2.4执行此操作,但在使用.read或.write

时,代码中出现“未处理的异常类型异常”错误

我的代码看起来像这样:

import java.io.InputStream;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

public class ftRoster extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Load in all available ship files here
    }

    public void myClickHandler(View view)
    {

     InputStream iStream = getResources().openRawResource(R.raw.ship);
     Serializer serializer = new Persister();
     ShipSystem newSystem = serializer.read(ShipSystem.class, iStream);

 }
}

我的班级看起来像这样:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root
public class ShipSystem
{
 @Element
 public String id = null;

 @Element
 public boolean destroyed = false;

 @Element
 public int systemValue = 0;

}

如果我在它周围放一个try / catch,当然错误会消失,但是那时也不会发生消毒。关于Simple的讨论很少,文档使它看起来像C#序列化一样简单。任何帮助都会受到赞赏。

我想要做的事情的全局视图是为每个“shipSystem”提供一个xml文件,并在应用程序启动时将每个文件反序列化为它自己的类实例,并将所有这些文件提供给数组进行查找。

感谢您花时间阅读并思考这个问题。

2 个答案:

答案 0 :(得分:0)

我已按如下方式更改myClickHandler以首先验证xml:

public void myClickHandler(View view)
{
    InputStream iStream = getResources().openRawResource(R.raw.system);
    Serializer serializer = new Persister();

    if(serializer.validate(ShipSystem.class, iStream))
    {
        ShipSystem newSystem = serializer.read(ShipSystem.class, iStream);
    }           
}

我改变了我的班级,看起来像这样:

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name="system")
public class ShipSystem
{
    @Attribute
    public String id = "0";

    @Element
    public boolean destroyed = false;

    @Element
    public int systemValue = 0;

}

和我试图反序列化的xml看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<system id="0">
    <destroyed>false</destroyed>
    <systemValue>0</systemValue>
</system>

似乎与序列化程序一起使用的任何方法都会导致类型异常的未处理异常,因为我使用serializer.validate也会导致同样的问题。我错过了SimpleXML所需的东西吗?

答案 1 :(得分:0)

我会尝试使用getter和setter将这些字段定义为属性。我不知道SimpleXML如何与公共字段一起使用。这也是糟糕的设计。