基本クラス 'Thing' から派生したオブジェクトのリストを含むオブジェクト階層をシリアル化したいです。これはデシリアライゼーションを含めて正常に動作しますが、XML-Simple は、実際に使用される Java クラスを指定する属性を記述することを主張します。
以下の Java コードで xml ファイルを作成すると、内容は次のようになります。
<example1>
<things>
<fruit class="com.mumpitz.simplexmltest.Apple" id="17">
<sugar>212</sugar>
</fruit>
<fruit class="com.mumpitz.simplexmltest.Orange" id="25" weight="11.2"/>
</things>
</example1>
しかし、これは私が望むものではありません。私はしたいです
<example1>
<things>
<apple id="17">
<sugar>212</sugar>
</apple>
<orange id="25" weight="11.2"/>
</things>
</example1>
class 属性のない 'apple' および 'orange' 要素であり、そのような属性を持つ 'fruit' ではありません。これは可能ですか?
(2 番目の xml は既存のスキーマに準拠しています。追加の属性を追加することはできません)
コードは次のとおりです。
package com.mumpitz.simplexmltest;
import java.io.File;
import java.util.ArrayList;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
class Fruit {
@Attribute(name = "id")
protected final int id;
Fruit(
@Attribute(name = "id")
int id) {
this.id = id;
}
int getObjectId() {
return id;
}
}
@Root
class Apple extends Fruit {
private final int sugar;
@Element(type = Fruit.class)
public Apple(
@Attribute(name = "id")
int id,
@Element(name = "sugar")
int sugar) {
super(id);
this.sugar = sugar;
}
@Element(name = "sugar")
public int getSugar() {
return this.sugar;
}
@Override
public String toString() {
return "id: " + id + ", sugar: " + sugar;
}
}
@Root
class Orange extends Fruit {
@Attribute
public double weight;
public Orange(
@Attribute(name = "id")
int id) {
super(id);
}
@Override
public String toString() {
return "id: " + id + ", weight: " + weight;
}
}
@Root
public class Example1 {
@ElementList
public ArrayList<Fruit> things = new ArrayList<Fruit>();
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("things:\n");
for (int i=0; i<things.size(); i++) {
sb.append(" " + things.get(i).toString() + "\n");
}
return sb.toString();
}
//////////////////////////////////
static Example1 createDummy() {
Example1 d = new Example1();
d.things.add(new Apple(17, 212));
Orange or = new Orange(25);
or.weight = 11.2;
d.things.add(or);
return d;
}
static String msg;
static Example1 res;
static public String getMessage() {
String m = msg;
msg = null;
return m;
}
static public boolean write(String path) {
Serializer serializer = new Persister();
Example1 example = Example1.createDummy();
File result = new File(path);
try {
serializer.write(example, result);
} catch (Exception e) {
e.printStackTrace();
msg = e.getMessage();
return false;
}
return true;
}
static public boolean read(String path) {
Serializer serializer = new Persister();
File source = new File(path);
try {
res = serializer.read(Example1.class, source);
} catch (Exception e) {
e.printStackTrace();
msg = e.getMessage();
return false;
}
return true;
}
public static Object getResult() {
return res;
}
}