3

私が見つけることができるXStreamコンバータに関する唯一のドキュメントは、次の2つのページにあります。

XStreamがXML入力を解析しているとき、XStreamはConverterLookup(およびデフォルトではDefaultConverterLookup)を使用して、クラスごとに使用するコンバーターを検索します。XStream独自のカスタムを使用するようにマッパーを構成したいのですが、それぞれのセッターではなく、メソッドConverterLookupのみが表示されます。getConverterLookup()

XStreamがDateXMLで値を検出し、それぞれを使用して戻るインスタンスがありますDateConverter。別のコンバーターを使用したいのですが、これは(私が信じている)自分のConverterimplを設定/登録する必要があることを意味します。これを行う方法を理解することはできません。前もって感謝します。

4

1 に答える 1

4

まず第一に、あなたの質問は実際には2つの無関係な質問です。私は、両方に答えるために最善を尽くします。

コンバーター

日付変換に関する2番目の質問へ。私の考えでは、これがあなたがここにいる理由のようです。

独自のコンバーターを追加する基本的な方法はかなり単純です。この方法registerConverterで手がかりが得られるはずです。Iを実装する方法がわからない場合はConverter、XStreamによってすでに提供されている多くのコンバーターの1つを確認することをお勧めします。余談ですが、コンバーターの優先順位について言及しなければならないような気がします。

コンバーターは、明示的な優先順位で登録できます。デフォルトでは、XStream.PRIORITY_NORMALに登録されています。同じ優先度のコンバーターは、登録されている逆の順序で使用されます。デフォルトのコンバーター、つまり他に登録されているコンバーターが適切でない場合に使用されるコンバーターは、優先度XStream.PRIORITY_VERY_LOWで登録できます。XStreamは、デフォルトでReflectionConverterをフォールバックコンバーターとして使用します。

言い換えると、同じクラスを受け入れる2つのコンバーターが与えられると、最後に追加されたものが使用されます。

ConverterLookup

あなたがあなたをどのように使うことができるかを答えるためにConverterLookup、同じ結果をもたらすかもしれない2つの方法があります、個人的に私は代替案2に行きます。

1)オーバーライドgetConverterLookup

    XStream xs = new XStream(){
        @Override
        public ConverterLookup getConverterLookup() {
            return new ConverterLookup() {

                public Converter lookupConverterForType(Class type) {
                    //Do your magic here
                }
            };
        }
    };

2)を使用してMapper

この場合、を保持しDefaultMapper、代わりMapperWrapperに新しいマッピング用にを実装します。(buildMapper内部をXStream.java見て、デフォルトのいくつかを確認してください)次のように初期化します。

    ClassLoader classLoader = new ClassLoaderReference(new CompositeClassLoader());
    Mapper mapper = new DefaultMapper(classLoader);
    mapper = new MyOwnMapperWrapper(mapper);
    XStream xs = new XStream(null, mapper, new XppDriver());
于 2013-01-23T19:29:10.510 に答える