1

XStream に次の問題があります。注釈を読み込もうとすると、次の文を使用する必要があります。

xstream.processAnnotations(DataClass .class);

これは、シリアル化するクラスを明示的に定義します。しかし、私のコードでは:

public class Tester {

    /**
     * @param args
     */
    public static void main(String[] args) {
        DataClass data = new DataClass();
        data.familyName = "Pil";
        data.firstName = "Paco";
        data.ID = 33;
        data.properties.put("one", "1");
        data.properties.put("two", "2");
        data.properties.put("three", "3");

        String xml = getXmlString(data);
        System.out.println(xml);
    }

    public static  String getXmlString(Object data) {
        String ret = "";
        final StringWriter stringWriter = new StringWriter();

        XStream xstream = new XStream(new StaxDriver());
        xstream.processAnnotations(Object.class);
        xstream.marshal(data, new PrettyPrintWriter(stringWriter));

        ret = stringWriter.toString();

        return ret;
    }
}

dataClass は次のとおりです。

@XStreamAlias("data")
public class DataClass {
    public Integer ID = 0;
    public String firstName = "";
    public String familyName = "";
    public Map<String, String> properties = null;

    public DataClass(){
        properties = new HashMap<String,String>();
    }
}

私はそのようなものが欲しいです:

public static  <T> String getXmlString(T data) {
        String ret = "";
        final StringWriter stringWriter = new StringWriter();

        XStream xstream = new XStream(new StaxDriver());
        xstream.processAnnotations(T.class);
        xstream.marshal(data, new PrettyPrintWriter(stringWriter));

        ret = stringWriter.toString();

        return ret;
    }

しかし、うまくいきません。

私がやろうとしていることは可能かどうか誰にも分かりますか?

4

5 に答える 5

2

おそらく、「Auto-detect Annotations」モードを有効にする必要があります。

public static <T> String getXmlString(T data) {
    final StringWriter stringWriter = new StringWriter();

    XStream xstream = new XStream(new StaxDriver());
    xstream.autodetectAnnotations(true);
    xstream.marshal(data, new PrettyPrintWriter(stringWriter));

    return stringWriter.toString();
}

「注釈の自動検出」の段落をお読みください。このソリューションに関連する問題に関するすべての情報を見つけることができます。例: ニワトリが先か卵が先か、同時実行性、例外、パフォーマンス。

結果:

<data>
  <ID>33</ID>
  <firstName>Paco</firstName>
  <familyName>Pil</familyName>
  <properties>
    <entry>
      <string>two</string>
      <string>2</string>
    </entry>
    <entry>
      <string>one</string>
      <string>1</string>
    </entry>
    <entry>
      <string>three</string>
      <string>3</string>
    </entry>
  </properties>
</data>
于 2013-02-15T14:18:47.813 に答える
1

あなたが使用することができます

if(data != null) xstream.processAnnotations(data.getClass());

オブジェクトの直接クラスにアクセスしますdataが、Thorn が示唆しているように、シリアル化するすべてのクラスを認識している単一のXStreamインスタンスを宣言する方がおそらく良いでしょう。

于 2013-02-15T14:15:55.833 に答える
1

init()xstream オブジェクトを初期化するメソッドを作成することをお勧めします。xstream オブジェクトにクラス スコープを持たせます。プロジェクト内で複数の xstream オブジェクトを作成する理由がなかったので、通常はこの方法で処理します。静的フィールドにすることもできます。すべての注釈処理メソッドを内部に配置しinit()、シリアル化する予定のすべてのクラスを明示的に登録します。

于 2013-02-15T14:08:53.023 に答える
0

私は1つの解決策を見つけたと思いますが、それは最善ではないかもしれませんが、本当に非常に柔軟である必要があるため、私のニーズに最適な解決策です

public static  <T> String getXmlString(T data, Class<?> dataClass) {
        String ret = "";
        final StringWriter stringWriter = new StringWriter();

        XStream xstream = new XStream(new StaxDriver());
        xstream.processAnnotations(dataClass);
        xstream.marshal(data, new PrettyPrintWriter(stringWriter));

        ret = stringWriter.toString();

        return ret;
    }

誰かがもっと良いものを見つけたら、とてもうれしいです。私は Java にまったく慣れていないので、おそらくこの言語の優れた機能をすべて使用しているわけではありません。

于 2013-02-15T14:14:17.347 に答える