Xstream - массив строк - PullRequest
       18

Xstream - массив строк

1 голос
/ 06 мая 2011

Перво-наперво, я не спрашиваю о решении, но имею способ думать.

У меня есть некоторые данные, которые мне нужно сериализовать, чтобы проверить позже ... Я знаю, как это сделать.... но имена полей являются проблемой ...

Структура данных содержит:

Name of the Field
CoordX
CoordY
Value

(Есть примерно 20 различных полей. Мне нужно проверить журнал строк biiiggggg...)

Я мог бы использовать одну строку [] [] или несколько строк [] ... как я уже сказал ... проблема в том, как это выглядит в 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 = "part")), и это не решает мою проблему.

Это может быть бесполезным, если на другой сторонекогда я делаю десериализацию, проверяю журнал построчно и нет по полю (я знаю, строка 1 - это имя поля, строка 2 - x..etc) ..

Итак ... что вы, ребята, думаете?

1 Ответ

1 голос
/ 26 мая 2011

Я обычно проектирую сериализацию в зависимости от содержимого моих «полей». Скажем, что ваши поля имени и значения относительно малы, вы можете сериализовать их как

<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>

Надеюсь, это поможет.

...