1

次の 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要素の値を抽出するにはどうすればよいですか?

4

3 に答える 3

0

Strategy注釈付きのクラスを XML スキーマとして使用し、スキーマに存在しないものは処理されない (訪問者はアクセスできない) ため、このアプローチは機能しないと思います。

コンバーターは次のように使用できます。

@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());

これはあまりエレガントではありませんが、必要に応じて適切な場合があります。

于 2013-08-06T15:42:53.200 に答える
0

Stragegya or Converteras ngKatonaが提案したソリューションを作成できませんでした。ただし、回避策を作成しましたが、うまくいきません。

/* 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クラスはパッケージ プライベートであるため、このヘルパー クラスをアプリケーションの他のコンポーネントに公開しません。

于 2013-08-08T21:54:17.807 に答える
0

いくつかの方法でそれを行うことができますが、コンバーターまたはストラテジーを使用するのが最善です。コンバーターは、2 つの中で最も簡単です。

于 2013-08-06T15:16:36.013 に答える