XML ファイルを読み取り、多数のオブジェクトを作成するカスタム メソッドがあります。
メソッドコード:
public static Property[] initProperties() {
Property p1, p2;
XStream xstream = new XStream();
xstream.alias("Property", Property.class);
xstream.registerConverter(new PropsConverter());
try {
ObjectInputStream in = xstream.createObjectInputStream(Utils.class.getResourceAsStream("Properties.xml"));
p1 = (Property) in.readObject();
System.out.println("P1_"+p1.getName());
p2 = (Property) in.readObject();
System.out.println("P2_"+p2.getName());
Property[] array = {p1,p2};
return array;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
カスタム コンバーターはSystem.Out.Println
すべてのステップに組み込まれているため、コンバーターが正しく読み取れるかどうかを確認できます。します。私はこのXMLファイルを持っています
<root>
<Property>
<name>Property 1</name>
<ownedBy>NULL</ownedBy>
<price>1000</price>
</Property>
<Property>
<name>Test2</name>
<ownedBy>NULL</ownedBy>
<price>1000</price>
</Property>
</root>
そして、コンバーターは両方を正しく吐き出します。別のクラスで関数を呼び出してinitProperties()
新しい配列を埋めると、問題が発生します。
メインクラス
try {
Properties[] availableProperties = Utils.initProperties();
} catch (Exception e) {
e.printStackTrace();
}
ここで、私が完全に間違っていない限りSystem.out.println(availableProperties[0].getName());
、Property 1 をSystem.out.println(availableProperties[1].getName());
印刷し、Test 2 を印刷する必要があります。
ただし、次の2行が表示されます。
テスト 2 テスト 2
なんで?
カスタム コンバーター
public class PropsConverter は Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(Property.class);
}
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Property props = (Property) value;
writer.startNode("name");
writer.setValue(props.getName());
writer.endNode();
writer.startNode("ownedBy");
writer.setValue(props.getName());
writer.endNode();
writer.startNode("price");
writer.setValue(props.getPriceAsString());
writer.endNode();
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Property props = new Property();
reader.moveDown();
props.setName(reader.getValue());
// System.out.println("NAME_" + reader.getValue());
reader.moveUp();
reader.moveDown();
props.setOwnedBy(reader.getValue());
// System.out.println("OWNEDBY_" + reader.getValue());
reader.moveUp();
reader.moveDown();
props.setPrice(Float.parseFloat(reader.getValue()));
// System.out.println("PRICE_" + reader.getValue());
reader.moveUp();
return props;
}
}