2016-05-03 9 views
0

オブジェクトをシリアル化してファイルにXMLとして書き込もうとしています。だから、私はそのXMLファイルを読み込み、それをクラスオブジェクトにデシリアライズしようとすると、null参照例外が発生します。androidのSimpleライブラリを使用してクラスオブジェクトを逆シリアル化する

私はこの例ではhttp://www.rhyous.com/2011/10/23/android-and-xml-serialization-with-simple/で作業していましたが、それはうまく動作しますが、これは単なる単純なクラスです。

私の場合は2つのクラスがあり、そのうちの1つに2番目のクラスのタイプのオブジェクトのリストがあります。

@Root (name = "Task") 
public class Task { 
    @Element 
    public String Name; 
    @Element 
    public int Image; 
    @ElementList (type = Item.class) 
    public ArrayList<Item> Items; 
    @Element 
    boolean IsChecked; 

    Task(){} 
    Task(String name, int image, ArrayList<Item> items, boolean isChecked){ 
     this.Name = name; 
     this.Image = image; 
     this.Items = items; 
     this.IsChecked = isChecked; 
    } 
} 

これは、Itemクラスは次のとおりです:

この

は、タスククラスです

@Root (name = "Item") 
public class Item { 
    @Element 
    public String Name; 

    @Element 
    public String Image; 

    @Element 
    public boolean IsChecked; 

    @Element 
    public String Description; 

    Item(String name, String image, String description) { 
     this.Name = name; 
     this.Image = image; 
     this.IsChecked = false; 
     this.Description = description; 
    } 

    Item(String name, String image, boolean isChecked, String description) { 
     this.Name = name; 
     this.Image = image; 
     this.IsChecked = isChecked; 
     this.Description = description; 
    } 
} 

これが主な活動です:ちょうど

public class MainActivity extends AppCompatActivity { 

    private static final String APP_DIR_PATH = Environment.getExternalStorageDirectory() + File.separator + "MyApp"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ArrayList<Item> items = new ArrayList<Item>(); 
     items.add(new Item("firstItem", APP_DIR_PATH + "/firstPic.jpg", "firstDescription")); 
     items.add(new Item("secondItem", APP_DIR_PATH + "/secondPic.jpg", "secondDescription")); 
     items.add(new Item("thirdItem", APP_DIR_PATH + "/thirdPic.jpg", "thirdDescription")); 

     Task firstTask = new Task("firstTask", 1, items, true); 

     // Serialization and writing to file 
     File xmlFile = new File(APP_DIR_PATH + "/Task.xml"); 
     try { 
      Serializer serializer = new Persister(); 
      serializer.write(firstTask, xmlFile); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Deserialization and reading from file 
     Task secondTask = null; 
     if (xmlFile.exists()) { 
      try { 
       Serializer serializer = new Persister(); 
       secondTask = serializer.read(Task.class, xmlFile); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     // This throws a null reference exception 
     Toast.makeText(getBaseContext(), secondTask.Name, Toast.LENGTH_SHORT).show(); 

     // If I try to serialize the object and write it to file, the file is empty, but that's to be expected :) 
     File secondXmlFile = new File(APP_DIR_PATH + "/secondTask.xml"); 
     try { 
      Serializer serializer = new Persister(); 
      serializer.write(secondTask, secondXmlFile); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

0

私が質問を投稿I問題を発見 - Itemクラスにデフォルトのコンストラクタがあると仮定

Item(){} 

シリアライズ/デシリアライズを処理するときは、デフォルトのコンストラクタが必要です。

関連する問題