Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Не удаётся сохранить HashSet коллекцию объектов в XML файл (java)

Имеются несколько объектов, которые нужно объединить в 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 collection = new HashSet<>(); rubbishBin.add(fr1); rubbishBin.add(fr2); rubbishBin.add(fr3);

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 jaxbElement = new JAXBElement(new QName("My_XML_Class"), FoodResidus[].class, hs); File fileWrite = new File(path); FileWriter fw = new FileWriter(fileWrite); BufferedWriter bw = new BufferedWriter(fw); marshaller.marshal(jaxbElement, 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); 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 theCollection; public ClassWrapper(){ theCollection = new HashSet(); } public HashSet getTheCollection(){ return theCollection; } public void setTheCollection(HashSet theCollection){ this.theCollection=theCollection; } }
В соответствии с этим немного изменил 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(); } }
В итоге всё заработало, надеюсь кому-нибудь будет полезно.

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

Отправить комментарий