Android, помогите с простой рамкой PersistenceException - PullRequest
2 голосов
/ 05 мая 2011

Я пытаюсь использовать org.simpleframework.xml. классы для обработки данных XML в моем проекте Android. Я не могу понять, как построить свой класс "Point" конструктор, чтобы соответствовать определению XML: во время выполнения я получаю это исключение:

org.simpleframework.xml.core.PersistenceException: Constructor not matched for class koine.marcos.wifidemo.Point

Мои данные XML выглядят так:


Файл points.xml:

<?xml version="1.0" encoding="utf-8"?>
<points>
   <point id="La Gioconda">
      <rssi ssid="beacon1" bssid="00:21:91:d1:36:62">-52</rssi>
      <rssi ssid="beacon2" bssid="00:12:a9:03:23:32">-97</rssi>
   </point>
   <point id="La Pietà">
      <rssi ssid="beacon1" bssid="00:21:91:d1:36:62">-68</rssi>
      <rssi ssid="beacon2" bssid="00:12:a9:03:23:32">-83</rssi>
   </point>
</points>

Файл Rssi.java:

@Root
public class Rssi {

    @Attribute(required=false)
    protected String id;

    @Element(required=false)
    protected Integer value;

    ... getters and setters ...
}

Файл point.java:

@Root
public class Point {
    @Attribute
    protected String id;

    @ElementMap(entry="rssi", key="id", attribute=false,
                inline=true, required=false)
    private Map<String,Integer> rssiMap;

    public Point(String id, Map<String,Integer>rssi) {
        this.id = id;
        ...
    }

    ...
}

File Points: Java:

@Element
public class Points {
    @ElementList(inline=true, required=true)
    private List<Point> list;

    ... getters and setters ...
}

1 Ответ

5 голосов
/ 06 мая 2011

Ладно, потому что я был твердым сторонником того, насколько на самом деле прост XML просто Я думал, что дам вам полный ответ на этот вопрос, и вот он здесь. Полностью рабочий код.

Points.java

// You can make this non private and more complex at will.
public class Points {
    @ElementList(entry = "point", inline = true) public ArrayList<Point> points;
}

Point.java

public class Point {
    private final String id;
    private final HashMap<String, Integer> rssiMap;

    public Point(@Attribute(name = "id") String id, @ElementMap(attribute = true, entry = "rssi", key = "ssid", valueType = Integer.class, inline = true) HashMap<String, Integer> rssiMap) {
        this.id = id;
        this.rssiMap = rssiMap;
    }

    @Attribute(name = "id") 
    public String getId() {
            return id;
    }

    @ElementMap(attribute = true, entry = "rssi", key = "ssid", valueType = Integer.class, inline = true)
    public HashMap<String, Integer> getRssi() {
            return rssiMap;
    }
}

Main.java

public class Main {
    public static void main(String[] args) throws Exception {
        Serializer serial = new Persister();

        // Warning: You will need to make sure that this file exists or change it.
        File file = new File("data/data.xml");
        Points points = serial.read(Points.class, file);
        for(Point point : points.points) {
            System.out.println(point.getId());
            for(Entry<String, Integer> entry : point.getRssi().entrySet()) {
                System.out.println(" " + entry.getKey() + ": " + entry.getValue());
            }
        }
    }
}

И это все, что есть. Это должно легко читаться в ваших данных. Если вы собираетесь протестировать этот код, то единственное, что вы должны убедиться в том, что функция Main правильно устанавливает файл, из которого вы собираетесь читать, или вы просто предоставляете функции чтения правильный ввод.

P.S. Я проверил это на своем компьютере, поэтому я знаю, что это работает. Приветствия.

...