2014-09-02 63 views
1

是否有可能顯示序列化/反序列化過程的進度?因爲我有大量的對象(200.000),需要10到20秒,所以我想向用戶顯示進度條。還是有更好的解決方案/庫?XStream Java顯示進度

+0

當你創建一個字符串(String xml = xstream.toXML())時,你是否有時間問題,或者當你將字符串寫入文件時會發生這種情況嗎? – 2014-09-02 11:07:58

+0

寫字符串,保存到光盤真的很快,它需要不到3秒(SSD) – schnawel007 2014-09-02 11:52:50

+0

看我的答案 - 我想你有一個列表或一棵樹,因此你知道你的'收藏'內有多少物品。 ..然後你可以增加計數器,每當一個項目的工作(Converter.WriteItem(..))...我不認爲你會有更新你的進度條的問題,但讓我知道這個解決方案是否工作你... – 2014-09-02 11:55:11

回答

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

謝謝,它的工作原理。稍後我會發布我的解決方案; – schnawel007 2014-09-02 13:24:42

+0

我很高興看到你的產品! – 2014-09-02 13:33:32

+1

在這裏我的解決方案:https://github.com/schnawel007/ExtendedXStream/tree/master/ExtendedXStream/src/de/joshuaschnabel/extendedxstream – schnawel007 2014-09-06 14:51:33

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> 

這應該是比編寫自定義轉換器的方法更通用。

+0

我的最終解決方案:https://github.com/schnawel007/ExtendedXStream – schnawel007 2014-09-07 18:01:15