我正在努力将一些XML转换为泛型类的对象。我的代码适用于非泛型类,但不适用于泛型类。
让我们看看这个例子,它使解释更容易。我使用泛型类和非泛型类来比较它们的行为。
Xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Box>
<doubleFieldA>
<myGenericField>20.3</myGenericField>
</doubleFieldA>
<doubleFieldB>
<myNonGenericField>20.3</myNonGenericField>
</doubleFieldB>
</Box>
Xsd架构:
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Box">
<xs:complexType>
<xs:sequence>
<xs:element name="doubleFieldA">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:double" name="myGenericField"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="doubleFieldB">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:double" name="myNonGenericField"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
GenericClass。java:
public class GenericClass<T> {
public T myGenericField;
}
非通用类。java:
public class NonGenericClass {
public double myNonGenericField;
}
盒java:
import com.thoughtworks.xstream.XStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Box {
public GenericClass<Double> doubleFieldA;
public NonGenericClass doubleFieldB;
private void deserialize() {
Box b;
String s;
XStream xs = new XStream();
try{
s = new String(Files.readAllBytes(Paths.get("src/my_xml.xml")));
b = (Box)xs.fromXML(s);
doubleFieldA = b.doubleFieldA;
doubleFieldB = b.doubleFieldB;
} catch (IOException ioe) {
System.err.println("IOException: " + ioe.getMessage());
}
}
public Box() {
deserialize();
}
}
主要的java:
public class Main {
public static void main(String[] args) {
Box box = new Box();
System.out.println("myGenericField = " + box.doubleFieldA.myGenericField);
System.out.println("myNonGenericField = " + box.doubleFieldB.myNonGenericField);
}
}
输出:
myGenericField=java。朗。Object@2d928643
myNonGenericField=20.3
预期输出(我想要的!):
myGenericField=20.3
myNonGenericField=20.3
我有一个具有两个属性的Box类:一个是泛型类,另一个只是普通类。
两者都有一个属性,在这个特定示例中,该属性的类型是double。
我尝试使用XStream用XML文件中存储的值初始化它们(两者都是20.3)。
最后,当我打印这些属性时,我会得到非泛型类的正确值。相反,泛型类属性会导致java。lang.Object。
我应该如何修改代码以获得预期的行为?
我怀疑XStream处理泛型类型的方式可能存在问题,但我不确定。
一般来说,我对XStream和XML技术没有太多的经验,因此我非常希望能通过工作代码/示例给出答案,而不是“您需要实现XYZ,在这个混乱的教程中了解如何实现!”。
非常感谢你!
注意:此代码的唯一目的是显示我的问题。我在一个更大的项目中遇到了这个问题,所以这只是一个复制它的小例子。