0

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;
}
}
4

0 に答える 0