Исключение с десериализацией простой XML-структуры

Я столкнулся с проблемой десериализации XML-файла, который был успешно сериализован с помощью простой XML-системы Serialization (simpleframework.org).

Есть исключение :

org.simpleframework.xml.core.PersistenceException: Constructor not matched for class projet.sarelo.Note 

Это вызов:

 Serializer serializer = new Persister(); File xmlFile = new File(path); ContactList contactList = serializer.read(ContactList.class, xmlFile); <== Error 

Мой контактList.java

 @Root(strict=false, name="ContacList") public class ContactList { @ElementArray (name = "Contacts") Contact [] contact; } 

Моя заметка.java

 public class Note { @Element(required=false) private String note; public Note(String note) { super(); this.note = note; } public String getNote() { return note; } } 

Мой Contact.java

 @Root public class Contact { @Attribute(name = "id") public String id; @Element(name="Nom", required=false) String name; @ElementArray(name="Phones", required=false) Phone [] phone; @ElementArray(name = "Emails", required=false) Email [] email; @ElementArray(name = "Adresses", required=false) Adresses [] adresses; @ElementArray(name = "Notes", required=false) Note [] note; public Contact(String id, String name) { super(); this.id = id; this.name = name; } public String getName() { return name; } public String getId(){ return id; } } 

И это файл XML, который я пытаюсь десериализовать.

 <ContactList> <Contacts length="5"> <contact id="1"> <Adresses length="0"/> <Emails length="0"/> <Notes length="1"> <note> <note>dgfdg</note> </note> </Notes> </contact> <contact id="2"> <Adresses length="1"> <adresses> <city>Paris </city> <postcode>751234 </postcode> <state>France</state> <street>Pignon</street> </adresses> </Adresses> <Emails length="1"> <email type="home"> <home>nicolas.sarkozy@elysee.fr</home> </email> </Emails> <Nom>Nicolas Sarkozy </Nom> <Notes length="1"> <note> <note>Je suis le president de toute la france. Le grand president</note> </note> </Notes> <Phones length="2"> <phone> <home>+33 1234</home> </phone> <phone> <mobile>+33 0612</mobile> </phone> </Phones> </contact> ... </Contacts> </ContactList> , <ContactList> <Contacts length="5"> <contact id="1"> <Adresses length="0"/> <Emails length="0"/> <Notes length="1"> <note> <note>dgfdg</note> </note> </Notes> </contact> <contact id="2"> <Adresses length="1"> <adresses> <city>Paris </city> <postcode>751234 </postcode> <state>France</state> <street>Pignon</street> </adresses> </Adresses> <Emails length="1"> <email type="home"> <home>nicolas.sarkozy@elysee.fr</home> </email> </Emails> <Nom>Nicolas Sarkozy </Nom> <Notes length="1"> <note> <note>Je suis le president de toute la france. Le grand president</note> </note> </Notes> <Phones length="2"> <phone> <home>+33 1234</home> </phone> <phone> <mobile>+33 0612</mobile> </phone> </Phones> </contact> ... </Contacts> </ContactList> , <ContactList> <Contacts length="5"> <contact id="1"> <Adresses length="0"/> <Emails length="0"/> <Notes length="1"> <note> <note>dgfdg</note> </note> </Notes> </contact> <contact id="2"> <Adresses length="1"> <adresses> <city>Paris </city> <postcode>751234 </postcode> <state>France</state> <street>Pignon</street> </adresses> </Adresses> <Emails length="1"> <email type="home"> <home>nicolas.sarkozy@elysee.fr</home> </email> </Emails> <Nom>Nicolas Sarkozy </Nom> <Notes length="1"> <note> <note>Je suis le president de toute la france. Le grand president</note> </note> </Notes> <Phones length="2"> <phone> <home>+33 1234</home> </phone> <phone> <mobile>+33 0612</mobile> </phone> </Phones> </contact> ... </Contacts> </ContactList> 

Solutions Collecting From Web of "Исключение с десериализацией простой XML-структуры"

No-Arg Constructor

Я не знаю эту конкретную структуру XML, но, как правило, вам нужен конструктор, который не принимает параметров / аргументов для каждого класса, который вы хотите десериализовать. Такие конструкторы известны как «no-arg», «0-argument» или (формально) нулевой конструктор .

В противном случае структура не может создать экземпляр класса.

Вам не нужно удалять вещи из конструктора. Вы можете просто добавить что-то вроде этого:

 public Contact(@Element (name = "id") String id, @Element (name = "name") String name) { ... 

Это работало для меня 🙂

Я думаю, что лучше использовать SAX для синтаксического анализа XML, это пример разбора:

Вам нужно создать парсер классов следующим образом:

  { public class DataXMLReader extends DefaultHandler { public DataXMLReader() { } public void startElement(String uri, String name, String qName,Attributes atts) { if (name.trim().equalsIgnoreCase("window")) { atts.getValue("type_id") // to get proprietis } else if (name.trim().equalsIgnoreCase("component")) { } } public void endElement(String uri, String name, String qName) throws SAXException { if (name.trim().equalsIgnoreCase("component")) { if(Integer.parseInt(typeid)<=6) idParent.remove(idParent.size()-1); } } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); Log.e("StartDoc","Reading XML"); } public void endDocument() throws SAXException { // TODO Auto-generated method stub myBdd.close(); Log.e("EndtDoc","End XML"); } } } 

И это пример вызова XML из URL:

 String url="http://vxbfdhbf.xml"; try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); URL sourceUrl = new URL(url); HttpURLConnection connection = null; connection = (HttpURLConnection)sourceUrl.openConnection(); connection.setConnectTimeout(60000); connection.setInstanceFollowRedirects(false); connection.connect(); DataXMLReader myXMLHandler = new DataXMLReader(this,"1"); xr.setContentHandler(myXMLHandler); xr.parse(new InputSource(connection.getInputStream())); connection.disconnect(); } catch (Exception e) { Log.e("saxERR",""+e.toString()); }