2011-05-06 78 views
1

首先,我不是要求解決方案,而是一種思考方式。Xstream - 字符串數組

我得到了一些數據,我需要序列化檢查出來以後......我知道如何做到這一點..但字段名稱的問題...

的數據結構包含:

Name of the Field 
CoordX 
CoordY 
Value 

(有喜歡.. 20個不同的領域。我需要檢查biiiggggg字符串日誌...)

我可以用一個String [] []或幾個字符串[] ...我說問題是它是如何出現在XML上的...

如果我做一個ArrayList的多維 - > [] []我得到這個

<teste> 
     <string-array> 
     <string>fieldName</string> 
     <string>x</string> 
     <string>y</string> 
     <string>value</string> 
     </string-array> 
     <string-array> 
     <string>fieldName</string> 
     <string>x</string> 
     <string>y</string> 
     <string>value</string> 
     </string-array> 
</teste> 

而且,如果我做一個字符串[]我可以把字符串的名稱作爲字段名

<Fieldname>  
    <string>X</string> 
    <string>y</string> 
    <string>Value</string> 
</Fieldname> 

我看到正常的別名是所有字段(@XStreamImplicit(itemFieldName =「部分」)),並沒有解決我的問題..

這可能是毫無價值的,如果在另一邊,當我做反序列化,按行檢查日誌,按字段檢查(我知道第1行是字段名,li ne 2是x..etc)..

那麼..你們怎麼看?

回答

1

我通常根據我的「字段」的內容設計序列化。再說說你的名字和值字段都比較小,你可以序列它們作爲

<list> 
    <field name="foo" cordX="12324" cordY="1324" value="value of field foo" /> 
    <field name="foo" cordX="12324" cordY="1324" value="value of field foo" /> 
</list> 
當然

,如果值是長的,那麼你不想序列化的屬性,而是像一個普通的字段值所以:

<list> 
    <field name="foo" cordX="12324" cordY="1324">The long value </field> 
    <field name="foo" cordX="12324" cordY="1324">Even longer field value...</field> 
</list> 

你可以做到這一點使用的XStream像這樣:

public class Run { 
    public static void main(String[] args) { 
     XStream xs = new XStream(new DomDriver()); 
     xs.processAnnotations(new Class[] { Field.class, Container.class }); 
     Container c = new Container(); 
     c.addField("boo", 1,2, "desc"); 
     c.addField("boo", 1,2, "desc"); 
     String serialized = xs.toXML(c); 
     System.out.println(serialized); 

     // deserialize 
     Container newContainer = (Container) xs.fromXML(serialized); 
     if (newContainer.fields.size() != 2) { 
      System.out.println("Not deserialized as expected..."); 
     } 

     // if you don't want "container" 
     xs.alias("mylist", List.class); 
     System.out.println(xs.toXML(c.fields)); 
    } 
} 

,你定義你的容器和現場像這樣:

@XStreamAlias("mylistofitems") 
public class Container { 
    public List<Field> fields; 

    public void addField(String name, int x, int y, String desc) { 
     if (fields == null) fields = new ArrayList<Field>(); 
     fields.add(new Field(name, x,y, desc)); 

    } 
} 

@XStreamAlias("field") 
public class Field { 
    public Field() {} 
    public Field(String name, int x, int y, String desc) { 
     this.name = name; 
     cordX = x; 
     cordY = y; 
     value = desc; 
    } 
    @XStreamAsAttribute 
    private String name; 
    @XStreamAsAttribute 
    private int cordX; 
    @XStreamAsAttribute 
    private int cordY; 
    @XStreamAsAttribute 
    private String value; 
} 

該計劃給出了這樣的輸出:

<mylistofitems> 
    <fields> 
    <field name="boo" cordX="1" cordY="2" value="desc"/> 
    <field name="boo" cordX="1" cordY="2" value="desc"/> 
    </fields> 
</mylistofitems> 
<mylist> 
    <field name="boo" cordX="1" cordY="2" value="desc"/> 
    <field name="boo" cordX="1" cordY="2" value="desc"/> 
</mylist> 

希望這有助於。