проблемы xStream - как десериализовать несколько объектов - PullRequest
8 голосов
/ 27 марта 2011

Я использую 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, чтобы поместить все эти теги в классы?Я не знаю, как заставить в классе получать различные объекты.

Очевидно, я сделаю это с массивом или каким-нибудь другим.Но я не знаю, как я могу это сделать.

Ответы [ 3 ]

12 голосов
/ 27 марта 2011

Для этого XML вы, вероятно, хотели бы иметь структуру класса, например:

public class Comment {
    long id
    String desc
}

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

Ваша логика демаршаллинга будет выглядеть примерно так:Нишан упомянул в комментариях, ваш XML не совсем правильно сформирован.Вам нужно убедиться, что ваш <comment> заканчивается </comment>, а не </comments>.Вам нужно будет это исправить, прежде чем код из этого ответа будет работать.

7 голосов
/ 05 января 2013

Хотя это старая ветка, но вот Аннотированная версия:

@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);
1 голос
/ 12 июля 2011

Если вы имеете дело с несколькими объектами, вы можете ожидать fromXML (InputStream 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;
    }
...