Имеются несколько объектов, которые нужно объединить в HashSet коллекцию и сохранить в XML файле и в дальнейшем их от туда извлечь
package laba2;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import static laba2.XMLworker.*;
public class Laba2 {
public static void main(String[]args){
FoodResidus fr1 = new FoodResidus();
fr1.name=someName1;
fr1.ID=0;
FoodResidus fr2 = new FoodResidus();
fr2.name=someName2;
fr2.ID=1;
FoodResidus fr3 = new FoodResidus();
fr3.name=someName3;
fr3.ID=2;
HashSet
try {
saveCollection("some.xml",collection);
} catch (JAXBException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Для это создал класс с двумя соответсвующими методами
package laba2;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
import java.io.*;
import java.util.ArrayList;
import java.util.HashSet;
public class XMLworker {
public static void saveCollection(String path, FoodResidus[] hs)throws JAXBException,IOException {
JAXBContext context = JAXBContext.newInstance(FoodResidus[].class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
JAXBElement
public static HashSet getCollection(String path)throws JAXBException,IOException{
File fileRead = new File(path);
FileReader fr = new FileReader(fileRead);
BufferedReader br = new BufferedReader(fr);
HashSet returnedHS = JAXB.unmarshal(br, HashSet.class);
return returnedHS;
}
}
Смотрю в получившийся файл, а там это:
Пробовал сохранять каждый объект отдельно, всё выходит корректно и с помощью метода getCollection() они прекрасно извлекаются.
Что не так с коллекциями?
Вот класс FoodResidus
package laba2;
public class FoodResidus {
public String name = "someOfFoodresidus";
public Integer ID=666;
public boolean fliesAttraction=false;
public FoodResidus(){}
}
}
Ответ
Решил
Люди подсказали, что XML не терпит коллекций в роли рутовых объектов
Использовал класс обёртку - ClassWrapper
package laba2;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.HashSet;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassWrapper {
private HashSet
В соответствии с этим немного изменил XMLworker
package laba2;
import javax.xml.bind.*;
import java.io.*;
import java.util.HashSet;
/**
* Created by danil on 23.02.2017.
*/
public class XMLworker {
public static void saveCollection(String path, HashSet hs)throws JAXBException,IOException {
JAXBContext context = JAXBContext.newInstance(ClassWrapper.class);
ClassWrapper cw = new ClassWrapper();
cw.setTheCollection(hs);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
File fileWrite = new File(path);
FileWriter fw = new FileWriter(fileWrite);
BufferedWriter bw = new BufferedWriter(fw);
marshaller.marshal(cw, bw);
}
public static HashSet getCollection(String path)throws JAXBException,IOException{
File fileRead = new File(path);
FileReader fr = new FileReader(fileRead);
BufferedReader br = new BufferedReader(fr);
ClassWrapper returnedHS = JAXB.unmarshal(br, ClassWrapper.class);
return returnedHS.getTheCollection();
}
}
В итоге всё заработало, надеюсь кому-нибудь будет полезно.
Комментариев нет:
Отправить комментарий