反序列化非字段元素的回调

时间:2013-08-05 14:55:16

标签: java xml xml-serialization simple-framework

我有以下XML结构:

<key>
   <element>
      someValue
   </element>

   <!-- lots of other elements which should be deserialized into the class -->

   <other>
      someOtherValue
   </other>
</key>

我使用Simple将其反序列化为以下Java类:

@Root(name = "key", strict = false)
public class Key {

    @Element(name = "element")
    private String element;

    // lots of more fields should be deserialized from xml
}

请注意,该类没有other元素的字段。我在课堂上不需要它的价值,但在其他地方。我如何拦截解析并提取此other元素的值?

3 个答案:

答案 0 :(得分:0)

您可以通过多种方式完成此操作,但最好是使用ConverterStrategy。转换器是两者中最容易的。

答案 1 :(得分:0)

我认为Strategy方法不起作用,因为它们使用带注释的类作为XML模式,以及未处理的模式中不存在的内容(访问者无法访问)。 / p>

转换器可以按如下方式使用:

@Root(name = "key", strict = false)
@Convert(KeyConverter.class)
public class Key {

    private String element;

    public Key(String elementValue) {
        element = elementValue;
    }

}

转换器在转换期间存储值:

public class KeyConverter implements Converter<Key> {

    private String otherValue;

    @Override
    public Key read(InputNode node) throws Exception {
        String elementValue = node.getNext("element").getValue().trim();
        otherValue = node.getNext("other").getValue().trim();
        return new Key(elementValue);
    }

    @Override
    public void write(OutputNode arg0, Key arg1) throws Exception {
        throw new UnsupportedOperationException();
    }

    /**
     * @return the otherValue
     */
    public String getOtherValue() {
        return otherValue;
    }

}

汇总:

    Registry registry = new Registry();

    KeyConverter keyConverter = new KeyConverter();
    registry.bind(Key.class, keyConverter);

    Persister serializer = new Persister(new RegistryStrategy(registry));
    Key key = serializer.read(Key.class, this.getClass().getResourceAsStream("key.xml"));
    // Returns the value "acquired" during the last conversion
    System.out.println(keyConverter.getOtherValue());

这不是太优雅,但可能适合您的需要。

答案 2 :(得分:0)

我建议使用StragegyConverter ng Katona 来解决问题。但是,我做了一个解决方法,虽然有效但不太好。

/* package */ class SerializedKey extends Key {

    @Element(name = "other", required = false)
    private int mOtherValue;

    public int getOtherValue() {
        return mOtherValue;
    }
}

...

Serializer serializer = new Persister();
SerializedKey key = serializer.read(SerializedKey.class, mInputStream);
int otherValue = key.getOtherValue();

在序列化包之外,我使用Key作为静态类型,所以我只是忘记另一个字段在该对象中。当我保留我的数据时,我也会持续Key,因此mOtherValue不再与该课程相关联。正如您所看到的,SerializedKey类是package-private,因此我不会将此帮助程序类公开给我的应用程序的任何其他组件。