繁体   English   中英

xStream问题-如何反序列化多个对象

[英]xStream problems - How to deserialize multiple objects

我正在使用xStream操作XML。 一切都还好。 放入XML存档等。 但是,我有一个问题:

示例:我的xml包含一个标签,在这个标签中,我还有一些名为<comment>标签。 看一个示例代码:

<comments>
   <comment>
      <id>1</id>
      <desc>A comment</desc>
   </comment>
   <comment>
      <id>2</id>
      <desc>Another comment</desc>
   </comment>
   <comment>
      <id>3</id>
      <desc>Another one comment</desc>
   </comment>
</comments>

并逐步。 我可以在标签内做500个标签。 这些注释是注释类型。

如何使用xStream进行序列化以将所有这些标签放入类中? 我不怎么在类中使其接收各种对象。

显然,我将使用Array或其他方法实现此目的。 但是我不知道该怎么做。

对于该XML,您可能希望具有类似以下的类结构:

public class Comment {
    long id
    String desc
}

public class Comments {
    List<Comment> comments = new ArrayList<Comment>();
}

您的解组逻辑将类似于:

XStream xstream = new XStream();
xstream.alias("comments", Comments.class);
xstream.alias("comment", Comment.class);
xstream.addImplicitCollection(Comments.class, "comments");
Comments comments = (Comments)xstream.fromXML(xml);

另外,正如Nishan在评论中提到的那样,您的XML格式不正确。 您需要确保<comment></comment>而不是</comments>结尾。 您需要先解决此问题,然后此答案中的任何代码才能起作用。

尽管它是旧线程,但是这里是带注释的版本:

@XStreamAlias("comment")
public class Comment {
    long id
    String desc
}

@XStreamAlias("comments")
public class Comments {
    @XStreamImplicit(itemFieldName = "comment")
    List<Comment> comments;
}

要解组,您需要以下步骤:

XStream xStream = new XStream();
xStream.processAnnotations(new Class[] { Comments.class, Comment.class });
Comments comments = (Comments)xStream.fromXML(xml);

如果您处理多个对象,则可能希望多次调用fromXMLInputStream in)以获取每个对象。 但是,该方法无法按预期方式处理,如果执行此操作,则会抛出措辞不佳的异常消息。 或者,将所有对象包装在一个较大的对象中可能会导致程序使用比所需更多的内存,或者内存不足。

为了解决这个问题,我制作了一个通用实用程序方法,这样我就可以将每个小对象解析为自己的字符串,这样就可以使用fromXML(String)方法,并且仍然可以扩展大小。

示例调用:

String element = next(in, "</MyObject>");
MyObject o = (MyObject)xstream.fromXML(element);

public static String next(InputStream in, String occurence) throws IOException {
        StringBuffer sb = new StringBuffer();
        int i;
        int pos = 0;
        while((i = in.read()) != -1) {
            sb.append((char)i);
            if(i == occurence.charAt(pos)) {
                pos ++;
            } else 
                pos = 0;

            if(pos == occurence.length())
                return sb.toString();
        }
        return null;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM