17

私は単純な XML シリアライゼーションを使用することに決めましたが、基本的な問題で立ち往生していました。java.util.UUIDこの小さなクラスの final フィールドとしてクラス インスタンスをシリアル化しようとしています。

@Root
public class Identity {
    @Attribute
    private final UUID id;

    public Identity(@Attribute UUID id) {
        this.id = id;
    } 
}

チュートリアルでは、次のようにコンバーターを登録してサードパーティ オブジェクトをシリアル化する方法を示します。

Registry registry = new Registry();
registry.bind(UUID.class, UUIDConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);

serializer.write( object, stream );

UUID の適切なコンバーターは非常に単純です。

public class UUIDConverter implements Converter<UUID> {
    @Override
    public UUID read(InputNode node) throws Exception {
       return new UUID.fromString(node.getValue());
    }
    @Override
    public void write(OutputNode node, UUID value) throws Exception {
       node.setValue(value.toString());
    }
}

しかし、この単純なコードは私にとってはうまくいきませんでした.UUIDフィールドを持つオブジェクトのシリアル化中に例外Transform of class java.util.UUID not supportedがスローされました。

私は自分のために働くカスタムMatcher(チュートリアルにはありませんでした)と似たようなことを試しました:

Serializer serializer = new Persister(new MyMatcher());

serializer.write( object, stream );

クラスは次のようになりMatcherます。

public static class MyMatcher implements Matcher {
    @Override
    @SuppressWarnings("unchecked")
    public Transform match(Class type) throws Exception {
        if (type.equals(UUID.class))
            return new UUIDTransform();
        return null;
    }
}

public class UUIDTransform implements Transform<UUID> {
    @Override
    public UUID read(String value) throws Exception {
        return UUID.fromString(value);
    }
    @Override
    public String write(UUID value) throws Exception {
        return value.toString();
    }
}

質問:

  • カスタムMatcherは、サードパーティクラスをストリーミングするために常に推奨される方法ですか?
  • どのような場合に Converter を使用できますか?
  • Simple XML のより良いチュートリアル/例はありますか?

ありがとうございました。

4

3 に答える 3

16

私は再び自分で答えなければなりません:-)

Simple XML のプロジェクト リーダーである Niall Gallagher からのサポート リストからのアドバイス:

「Converter または Transform のいずれかを使用できます。UUID の場合、Matcher を使用した Transform が最も簡単なオプションだと思います。」

だから、私はTransform<T>/を使っMatcherて満足しています。これは、私にとってはうまくいかないという事実を変えるものではConverter<T>ありません:-)

于 2010-09-08T14:20:25.197 に答える
1

私はこれに対する答えを持っていると思います。

Strategy strategy = new AnnotationStrategy();
Serializer serializer = new Persister(strategy);

コンバーターを登録して問題を解決する必要があります。

于 2013-05-16T09:17:28.150 に答える
0

これは少し古いことは知っていますが、同じ例外に遭遇した可能性があります。

実際の問題は、@Attribute アノテーションの使用です。@Attribute の代わりに @Element を配置すると、例外は表示されず、シリアライゼーションにコンバーターが使用されます。

コンバーターを作成するか、Marker-Transform ソリューションを使用する必要があるかは、使用した注釈に依存すると思います。これが意図的な動作かどうかはわかりませんが。

于 2016-01-15T09:30:19.537 に答える