Java XStream中没有已知类类型的注释

Java XStream中没有已知类类型的注释,java,generics,serialization,xml-serialization,xstream,Java,Generics,Serialization,Xml Serialization,Xstream,XStream有以下问题:当我试图阅读注释时,我需要使用以下句子: xstream.processAnnotations(DataClass .class); 它明确定义了我要序列化的类。但在我的代码中: public class Tester { /** * @param args */ public static void main(String[] args) { DataClass data = new DataClass();

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;
    }
}
其中数据类为:

@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>();
    }
}
@XStreamAlias(“数据”)
公共类数据类{
公共整数ID=0;
公共字符串firstName=“”;
公共字符串familyName=“”;
公共映射属性=null;
公共数据类(){
properties=newhashmap();
}
}
我想要这样的东西:

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;
    }
公共静态字符串getXmlString(T数据){
字符串ret=“”;
最终StringWriter StringWriter=新StringWriter();
XStream XStream=newxstream(new statxdriver());
processAnnotations(T.class);
xstream.marshal(数据,新的PrettyPrintWriter(stringWriter));
ret=stringWriter.toString();
返回ret;
}
但它不起作用


有人知道我正在尝试做什么吗?

我建议您创建一个初始化xstream对象的
init()
方法。让xstream对象具有类作用域。我从来没有理由在一个项目中创建多个xstream对象,所以我通常以这种方式处理它。你甚至可以把它变成一个静态场。将所有注释处理方法放在
init()
中,并显式注册希望序列化的每个类。

我建议您创建一个初始化xstream对象的
init()
方法。让xstream对象具有类作用域。我从来没有理由在一个项目中创建多个xstream对象,所以我通常以这种方式处理它。你甚至可以把它变成一个静态场。将所有注释处理方法放在
init()
中,并显式注册希望序列化的每个类。

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

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;
    }
公共静态字符串getXmlString(T数据,类dataClass){
字符串ret=“”;
最终StringWriter StringWriter=新StringWriter();
XStream XStream=newxstream(new statxdriver());
processAnnotations(数据类);
xstream.marshal(数据,新的PrettyPrintWriter(stringWriter));
ret=stringWriter.toString();
返回ret;
}

如果有人能找到更好的,我会很高兴的。我对Java非常陌生,可能没有使用该语言的所有酷功能。

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

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;
    }
公共静态字符串getXmlString(T数据,类dataClass){
字符串ret=“”;
最终StringWriter StringWriter=新StringWriter();
XStream XStream=newxstream(new statxdriver());
processAnnotations(数据类);
xstream.marshal(数据,新的PrettyPrintWriter(stringWriter));
ret=stringWriter.toString();
返回ret;
}
如果有人能找到更好的,我会很高兴的。我对Java非常陌生,可能我没有使用这种语言的所有很酷的功能。

您可以使用

if(data != null) xstream.processAnnotations(data.getClass());
要访问
数据
对象的直接类,但正如Thorn所建议的,最好声明一个
XStream
实例,该实例知道要序列化的所有类。

您可以使用

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

要访问
数据
对象的直接类,但正如Thorn所建议的,最好声明一个
XStream
实例,该实例知道要序列化的所有类。

可能应该启用“”模式:

公共静态字符串getXmlString(T数据){
最终StringWriter StringWriter=新StringWriter();
XStream XStream=newxstream(new statxdriver());
xstream.autodetectanotations(true);
xstream.marshal(数据,新的PrettyPrintWriter(stringWriter));
返回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>

33
帕科
皮尔
二
2.
一
1.
三
3.

您可能应该启用“”模式:

公共静态字符串getXmlString(T数据){
最终StringWriter StringWriter=新StringWriter();
XStream XStream=newxstream(new statxdriver());
xstream.autodetectanotations(true);
xstream.marshal(数据,新的PrettyPrintWriter(stringWriter));
返回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>

33
帕科
皮尔
二
2.
一
1.
三
3.

可能与此问题没有直接关系,但如果使用Spring XStreamMarshaller,则需要按如下方式打开XStream注释的检测:

    <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
       <property name="autodetectAnnotations" value="true"/>
    </bean>

可能与此问题没有直接关系,但如果使用Spring XStreamMarshaller,则需要按如下方式打开XStream注释的检测:

    <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
       <property name="autodetectAnnotations" value="true"/>
    </bean>


我的xstream对象不能具有类作用域,因为我使用的是静态方法。我正在做一个“实用程序”类,可以在项目的其余部分使用。但是你的评论给了我一个想法:)我用同样的方法处理这个问题——我所有的文件访问代码都由静态方法组成。在调用任何其他静态方法之前,将xstream设为静态并调用静态init()方法。我的xstream对象不能具有类作用域,因为我使用的是静态方法。我