У меня есть xml-документ следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<Calculations>
<desc>Calculations Description</desc>
<Calculation operator="ADD" valueA="1" valueB="2">
<desc>First Description</desc>
<owners>
<owner id="1"><name>Alan</name></owner>
<owner id="2"><name>Karen</name></owner>
<owner id="3"><name>Isla</name></owner>
<owner id="4"><name>Bethany</name></owner>
</owners>
</Calculation>
<Calculation operator="SUBTRACT" valueA="3" valueB="1">
<desc>Second Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
<Calculation operator="MULTIPLY" valueA="2" valueB="5">
<desc>Third Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
<Calculation operator="DIVIDE" valueA="2" valueB="5">
<desc>Fourth Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
</Calculations>
Я пытаюсь десериализировать его, используя следующие классы Java:
Calculations.java:
package Simple;
import java.util.List;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root(name="Calculations")
public class Calculations {
@Element(name="desc")
private String text;
@ElementList(inline=true)
public static List<Calculation> calculations;
public Calculations() {
super();
}
public List<Calculation> getCalculations() {
return calculations;
}
public String getDescription() {
return text;
}
}
Calculation.java:
package Simple;
import java.util.List;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root(name="Calculation")
public class Calculation {
public Calculation() {
super();
}
@Attribute(name="operator")
private String operator;
@ElementList
public static List<Owner> owners;
public String getOperator() {
return operator;
}
public List<Owner> getOwners() {
return owners;
}
}
и owner.java:
package Simple;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root(name="Owner")
public class Owner {
public Owner() {
super();
}
@Attribute(name="id")
private String id;
@Element(name="name")
private String name;
public String getID() {
return id;
}
public String getName() {
return name;
}
}
У меня он работает успешно (в основном) - на данный момент он просто в тестовом проекте, и я пишу подробности на консоль с несколькими циклами.
Проблема заключается в том, что когда я распечатываю его, вместо каждого "Расчет", имеющего 4 владельца, то, что возвращается, состоит в том, что каждый расчет имеет 16 владельцев - все 16 владельцев возвращаются для каждого расчета, как показано на моей консоли:
ADD
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
SUBTRACT
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
MULTIPLY
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
DIVIDE
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
end
Я обыскал форумы в течение нескольких часов, а также проходил через обучающие программы SimplXML и примеры, и я просто не могу понять, почему это происходит.
Я предположил, что, когда процесс "чтения" повторяется через это, поскольку он входит в каждый расчет, он просто выбирает владельцев из этой итерации, но по какой-то причине он добавляет все их к каждому вычислению.
Буду признателен за любую помощь, которую вы можете дать.
Благодаря,
Алан
Я рекомендую не использовать поля статического списка, вместо этого вы используете нестатические или экземпляры полей списка в своих классах.
т.е. измените это:
@ElementList
public static List<Owner> owners;
к этому:
@ElementList
public List<Owner> owners; // not static
и то же самое для изменения этого:
@ElementList(inline=true)
public static List<Calculation> calculations;
к этому:
@ElementList(inline=true)
public List<Calculation> calculations;
Статично, все экземпляры класса будут иметь один и тот же список, то есть все экземпляры Calculation будут иметь тот же список владельцев, и это может быть источником проблем для вас. Также вы должны серьезно подумать о том, чтобы сделать поля выше приватных и разрешить доступ только через геттеры и сеттеры. Позже вы можете захотеть только выпустить глубокую копию исходного списка, и это может быть выполнено только в том случае, если вы ограничиваете прямой доступ к полям.