Java XStream中没有已知类类型的注释
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.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对象不能具有类作用域,因为我使用的是静态方法。我