XStream Java показывает прогресс

1

есть ли возможность отобразить ход процесса сериализации/десериализации? Потому что у меня огромное количество объектов (200 000), и это занимает 10-20 секунд, поэтому я хочу показать пользователю индикатор выполнения. Или есть лучшее решение/библиотека?

  • 0
    Есть ли у вас проблемы с синхронизацией при создании строки (String xml = xstream.toXML ()) или это происходит при записи строки в файл?
  • 0
    Запись строки, сохранение на диск очень быстро, это занимает менее 3 секунд (SSD)
Показать ещё 3 комментария
Теги:
xstream

2 ответа

1
Лучший ответ

вы можете создать собственный конвертер...

Я предполагаю, что у вас есть коллекция, в которой хранятся ваши данные...

ArrayList<String> stringList = new ArrayList<String>();  //example list
stringList.add("abc"); //example data
stringList.add("abc"); //example data
stringList.add("abc"); //example data
stringList.add("abc"); //example data

XStream xstream = new XStream();
xstream.alias("string", String.class ); //example aliasing

Mapper mapper = xstream.getMapper();

CollectionConverter aColCon = new CollectionConverter(mapper) {

    @Override
    protected void writeItem(Object item, MarshallingContext context, HierarchicalStreamWriter writer){
        super.writeItem(item, context, writer);
        System.out.println("write object item"+item);
        //TODO your progress bar here!

    }
};

xstream.registerConverter(aColCon);
String asXml = xstream.toXML(stringList);
System.out.println(asXml);

это результат:

write object itemabc
write object itemabc
write object itemabc
write object itemabc
<list>
  <string>abc</string>
  <string>abc</string>
  <string>abc</string>
  <string>abc</string>
</list>

посмотрите http://x-stream.github.io/javadoc/com/thoughtworks/xstream/converters/collections/AbstractCollectionConverter.html#readItem%28com.thoughtworks.xstream.io.HierarchicalStreamReader,%20com.thoughtworks.xstream.converters.UnmarshallingContext, %20java.lang.Object% 29 там вы можете найти лучший конвертер...

  • 0
    Спасибо, это работает. Позже я опубликую свое решение;
  • 0
    Я был бы рад увидеть, что вы произвели!
Показать ещё 2 комментария
0

Или вы можете расширить HierarchicalStreamWriter и добавить некоторую информацию о ходе в startNode

@XStreamAlias("entity")
private static class Entity {
    String foo;
    String bar;
}

private static class ProgressIndicationWriter extends PrettyPrintWriter {
    public ProgressIndicationWriter(Writer writer, NameCoder nameCoder) {
        super(writer, nameCoder);
    }

    @Override
    public void startNode(String name) {
        System.out.print("writing node " + name + ".. ");
        super.startNode(name);
        System.out.println("OK");
    }
}

private static class ProgressIndicationDriver extends XppDriver {
    @Override
    public HierarchicalStreamWriter createWriter(Writer out) {
        return new ProgressIndicationWriter(out, getNameCoder());
    }
}

public static void main(String[] args) {
    final XStream xstream = new XStream(new ProgressIndicationDriver());
    xstream.autodetectAnnotations(true);

    final Entity myEntity = new Entity();
    myEntity.foo = "Lorem";
    myEntity.bar = "Ipsum";

    final String xml = xstream.toXML(myEntity);
    System.out.println();
    System.out.println(xml);
}

И выход

writing node entity.. OK
writing node foo.. OK
writing node bar.. OK

<entity>
  <foo>Lorem</foo>
  <bar>Ipsum</bar>
</entity>

Это должно быть более общим, чем подход к написанию пользовательского конвертера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню