На Android simple-xml serial.read() выдает ошибку StackOverflowError

#java #android #simple-framework

#java #Android #simple-framework

Вопрос:

Я пытаюсь научиться использовать xml в Java (платформа Android, с использованием Eclipse и simple-xml-2.5.2). Я продолжаю получать странный java.lang.Ошибка StackOverflowError в строке «serial.read» в «Training.java «. Можете ли вы помочь устранить проблему? Это ошибка определения xml?

Я включаю источник ниже:

Файл beacons.java:

 package com.marcos.training;

import java.util.List;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;

@Element
public class Beacons {
    @ElementList(inline=true)
    private List<Beacon> list;

    @Element
    private String id;

    public String getId() {
       return id;
    }

    public Integer getSize() {
        return list.size();
    }

    public List<Beacon> getList() {
       return list;
    }
}
  

Файл Beacon.java:

 package com.marcos.training;

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

@Root
public class Beacon {

    @Attribute
    protected String ssid;

    @Element
    protected String bssid;

    public String getSsid() {
       return ssid;
    }

    public String getBssid() {
      return bssid;
   }
}
  

Файл Training.java:

 package com.marcos.training;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.content.res.Resources.NotFoundException;

public class Training extends Activity {
private final static String TAG = Training.class.getCanonicalName();
TextView textStatus;

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

        textStatus = (TextView) findViewById(R.id.textStatus);

        Serializer serial = new Persister();

        try {
            Beacons myBeacons;
            try {
                myBeacons = serial.read(Beacons.class, getResources().openRawResource(R.xml.beacons));
            Log.i(TAG, "Number of Beacons: "   myBeacons.getSize());
        } catch (NotFoundException e) {
                Log.d(TAG, "Uncaught exception", e);
            return;
        } catch (Exception e) {
                Log.d(TAG, "Uncaught exception", e);
            return;
        }

        int len = myBeacons.getSize();
            for (int i = 0; i < len; i  ) {
                Beacon b = myBeacons.getList().get(i);
                textStatus.append("Beacon "   (i 1)   "n");
                textStatus.append(" SSID   : "   b.getSsid()   "n");
                textStatus.append(" BSSID  : "   b.getBssid()   "n");
                textStatus.append("n");;
            }
        } catch (Exception e) {
            Log.d(TAG, "Uncaught exception", e);
        }
    }
}
  

Файл beacons.xml:

 <?xml version="1.0" encoding="utf-8"?>
<beacons id="1">
 <beacon ssid="north">
  <bssid>01:02:03:04:05:06</bssid>
 </beacon>
 <beacon ssid="east">
  <bssid>02:03:04:05:06:07</bssid>
 </beacon>
 <beacon ssid="south">
  <bssid>03:04:05:06:07:08</bssid>
 </beacon>
 <beacon ssid="west">
  <bssid>04:05:06:07:08:09</bssid>
 </beacon>
</beacons>
  

Ответ №1:

Помещая ваш XML-файл в XML-каталог ресурсов, система сборки Android предполагает, что вы хотите, чтобы он был скомпилирован в двоичный формат, и это обязывает вас. Поэтому, когда вы обращаетесь к этому входному потоку, а затем пытаетесь обработать его как текстовое представление XML, это просто не работает. У вас есть 2 варианта.

  1. Переместите ваш XML-файл в resraw каталог.
  2. Оставьте все как есть, используйте getResources().getXml(R.xml.beacons) API и создайте анализатор извлечения для вашего конкретного XML.

Смотрите эту ссылку для получения более подробной информации.

Комментарии:

1. Спасибо! Это было действительно решение! Ты спас мой день 🙂