+ Antworten
Ergebnis 1 bis 5 von 5

Thema: XStream Objekte unmarshallen

  1. #1
    User Kilobyte Themenstarter

    Registriert seit
    01.08.2013
    Ort
    Mitten in Deutschland
    Fachbeiträge
    122
    Genannt
    2 Post(s)
    Blog-Einträge
    1
    Hi,
    ich versuche ein XML-Parser mit der XStream Bibliothek zu bauen. Was ich über die Bibliothek gehört habe kling auch gut, das Marshallen funktioniert in einem Test auch schon. Das Unmarschallen komischerweise nicht. Gehe ich da verkehrt ran? Über einen Hinweis würde ich mich freuen

    Marshalling Test
    Java Code:
    1.  
    2.     public void serializeTest(){
    3.        
    4.         System.out.println(xStream.toXML(getSampleOutput()));
    5.     }
    6.  
    7. private Output getSampleOutput(){
    8.         Output eo=new Output();
    9.         IoFormat ef=new IoFormat();
    10.         ef.setName("FormatName");
    11.         eo.setFormat(ef);
    12.         IoSize es=new IoSize();
    13.         es.setBytes(123L);
    14.         eo.setSize(es);
    15.         IoPages eop=new IoPages();
    16.         eop.setCount(2);
    17.         eo.setPages(eop);
    18.         return eo;
    19.     }

    Unmarshallig Test
    Java Code:
    1.  
    2.  
    3. private final XStream xStream;
    4.  
    5.     public ParserTest() {
    6.         xStream = new XStream(new StaxDriver());
    7.         xStream.autodetectAnnotations(true);
    8.     }
    9. ...
    10.  
    11. @Test
    12.     public void outputParsingTest() throws IOException {
    13.         File file = new File("../importer/test/output.log");
    14.         System.out.println(file.getCanonicalPath() + " " + file.exists());
    15.         assertTrue(file.getCanonicalPath() + " have to exist", file.exists());
    16.         try {
    17.             Output eo = (Output) xStream.fromXML(file);
    18.             System.out.println(eo);
    19.             assertNotNull("EntryOutput instance not null", eo);
    20.             assertTrue("eo instanceof EntryOutput", eo instanceof Output);
    21.         } catch (Exception ex) {
    22.             ex.printStackTrace();
    23.         }
    24.     }

    Hier noch die Fehlermeldung:
    com.thoughtworks.xstream.mapper.CannotResolveClassException: output
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
    at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1206)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1190)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1154)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1096)

  2. #2
    User Kilobyte Avatar von Marcinek
    Registriert seit
    03.05.2013
    Ort
    Waltrop
    Fachbeiträge
    153
    Genannt
    9 Post(s)
    Blog-Einträge
    1
    Hi,

    wie sieht die XML aus und wie sieht die OUTPUT Klasse aus?

    Gruß,
    Martin

  3. #3
    User Kilobyte Themenstarter

    Registriert seit
    01.08.2013
    Ort
    Mitten in Deutschland
    Fachbeiträge
    122
    Genannt
    2 Post(s)
    Blog-Einträge
    1
    Hier ist die XML-Die Output und deren Unterklassen
    XML Code:
    1. <output>
    2.             <size bytes="116221"/>
    3.             <format name="txt"/>
    4.             <pages count="2"/>
    5.         </output>

    Java Code:
    1. @XStreamAlias("output")
    2. public class Output {
    3.    
    4.     @XStreamAlias("size")
    5.     private IoSize size;
    6.    
    7.     @XStreamAlias("format")
    8.     private IoFormat format;
    9.    
    10.     @XStreamAlias("pages")
    11.     private IoPages pages;
    12.  
    13.     public IoSize getSize() {
    14.         return size;
    15.     }
    16.  
    17.     public void setSize(IoSize size) {
    18.         this.size = size;
    19.     }
    20.  
    21.     public IoFormat getFormat() {
    22.         return format;
    23.     }
    24.  
    25.     public void setFormat(IoFormat format) {
    26.         this.format = format;
    27.     }
    28.  
    29.     public IoPages getPages() {
    30.         return pages;
    31.     }
    32.  
    33.     public void setPages(IoPages pages) {
    34.         this.pages = pages;
    35.     }
    36.  
    37. }

    Java Code:
    1. public class IoFormat {
    2.  
    3.         @XStreamAlias("name")
    4.         @XStreamAsAttribute
    5.         private String name;
    6.  
    7.         public String getName() {
    8.             return name;
    9.         }
    10.  
    11.         public void setName(String name) {
    12.             this.name = name;
    13.         }
    14.     }

    Java Code:
    1. public class IoPages {
    2.  
    3.     @XStreamAlias("count")
    4.     @XStreamAsAttribute
    5.     Integer count;
    6.  
    7.     public Integer getCount() {
    8.         return count;
    9.     }
    10.  
    11.     public void setCount(Integer count) {
    12.         this.count = count;
    13.     }
    14. }

    Java Code:
    1. public class IoSize {
    2.  
    3.     @XStreamAlias("bytes")
    4.     @XStreamAsAttribute
    5.     private Long bytes;
    6.  
    7.     public Long getBytes() {
    8.         return bytes;
    9.     }
    10.  
    11.     public void setBytes(Long bytes) {
    12.         this.bytes = bytes;
    13.     }
    14.  
    15. }

  4. #4
    User Kilobyte Avatar von Marcinek
    Registriert seit
    03.05.2013
    Ort
    Waltrop
    Fachbeiträge
    153
    Genannt
    9 Post(s)
    Blog-Einträge
    1
    Hi,

    leider ist so, dass auto detect annotations nur für die von XStream verarbeiteten (bekannten) Klassen durchgeführt wird. Im speziellen kann die Klasse output nicht geladen werden, weil XStream die Annotationen nicht gescannt hat.

    Entweder man verzichtet auf diese Annotation oder man verwendet "xstream.processAnnotation()", um die Klasse von XStream verarbeiten zu lassen.

    Es hat mich ein wenig gewundert, dass das so ist, obwohl ich es iind ieser Form von meinem Projekt verwende. Ich habe aber keine XStreamAlias Annotationen, so dass der volle Klassenname serialisiert wird.

    I.d.r. sollte das Aussehen der XML für das Programm egal sein.

    Gruß,
    Martin

  5. Es bedanken sich:
    spellsleeper (26.07.2015)
  6. #5
    User Kilobyte Themenstarter

    Registriert seit
    01.08.2013
    Ort
    Mitten in Deutschland
    Fachbeiträge
    122
    Genannt
    2 Post(s)
    Blog-Einträge
    1
    Danke mit
    Java Code:
    1.  
    2. ...
    3. xStream.processAnnotations(Output.class);
    4.         xStream.processAnnotations(IoFormat.class);
    5.         xStream.processAnnotations(IoPages.class);
    6.         xStream.processAnnotations(IoSize.class);
    7. ...
    funktioniert es!

+ Antworten Thema als "offen" markieren

Direkt antworten Direkt antworten

Eine Verkehrsampel hat drei Farben. Rot, gelb und ...

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Android - 3D Objekte darstellen
    Von groggy im Forum Android
    Antworten: 0
    Letzter Beitrag: 26.07.2014, 15:09
  2. (Listen) Allgemeine Objekte vergleichen
    Von TheAceOfSpades im Forum Java-Grundlagen
    Antworten: 15
    Letzter Beitrag: 22.07.2014, 15:19
  3. Objekte grafisch darstellen
    Von tommy0014 im Forum AWT, Swing, JavaFX & SWT
    Antworten: 20
    Letzter Beitrag: 22.08.2013, 16:41
  4. Hibernate Objekte locken
    Von SirWayne im Forum APIs & Frameworks
    Antworten: 8
    Letzter Beitrag: 13.01.2009, 13:05
  5. 04.02 Objekte
    Von RSS Reader im Forum Java-Blog-Buch
    Antworten: 0
    Letzter Beitrag: 09.09.2008, 09:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •