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

可能您应该启用“自动检测注释”模式:

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

我建议您创建一个init()初始化 xstream 对象的方法。让您的 xstream 对象具有类范围。我从来没有理由在一个项目中创建多个 xstream 对象,所以我通常以这种方式处理它。您甚至可以将其设为静态字段。将所有注释处理方法放入init()并显式注册您希望序列化的每个类。

于 2013-02-15T14:08:53.023 回答
1

你可以使用

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

访问data对象的直接类,但正如 Thorn 建议的那样,最好声明一个XStream知道您将要序列化的所有类的单个实例。

于 2013-02-15T14:15:55.833 回答
0

我想我找到了一种解决方案,它可能不是最好的,但由于我需要非常灵活,它是最适合我需求的解决方案:

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 回答
0

也许与这个问题没有直接关系,但如果你使用 Spring XStreamMarshaller,你需要打开 XStream 注释的检测,如下所示:

    <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
       <property name="autodetectAnnotations" value="true"/>
    </bean>
于 2015-06-02T06:25:25.250 回答