是否可以使用multiple";将多个Java类对象序列化为单个XML文件;根“;元素?
我正在为一个应用程序处理相当复杂和大量的用户设置。我明智地决定将它分解为几个更小、更简单的类,每个类负责一组特定的用户设置,而不是让一个单一的megalithic类负责每个设置 为了简单起见(我希望如此),我希望将这些设置实例中的每一个都存储在一个XML文件中,并防止文件数量变得过于庞大 所以我们来回答我的问题: 如果我有一个包含单个根元素的XML文件,是否可以在同一个根元素中存储多个对象,并在以后提取它们,或者更理想的情况下(为了使其更具可读性),是否可以在一个XML文件中以不同的根元素名称存储多个对象?例如:下面的例子可以吗是否可以使用multiple";将多个Java类对象序列化为单个XML文件;根“;元素?,java,xml,serialization,jaxb,Java,Xml,Serialization,Jaxb,我正在为一个应用程序处理相当复杂和大量的用户设置。我明智地决定将它分解为几个更小、更简单的类,每个类负责一组特定的用户设置,而不是让一个单一的megalithic类负责每个设置 为了简单起见(我希望如此),我希望将这些设置实例中的每一个都存储在一个XML文件中,并防止文件数量变得过于庞大 所以我们来回答我的问题: 如果我有一个包含单个根元素的XML文件,是否可以在同一个根元素中存储多个对象,并在以后提取它们,或者更理想的情况下(为了使其更具可读性),是否可以在一个XML文件中以不同的根元素名称存
@XMLRootElement(name = "Settings")
public class EQLGameSettings{
@XmlElement(name="PlayerCount")
final private Integer PlayerCount;
@XmlElement(name="GameMode")
final private EQLGameMode Mode;
@XmlElement(name="WinnerOnNewGame")
final private Boolean WinnerOnNewGame;
.
.
.
}
是否将它们存储在同一个根元素下的同一个XML文件中,并在以后反序列化
@XMLRootElement(name = "Settings")
public class EQLScoreSettings{
@XmlElement(name="ScoreValue")
final private Integer ScoreValue;
@XmlElement(name="PenaltyImposed")
final private Integer PenaltyImposed;
@XmlElement(name="VictoryScore")
final private Integer VictoryScore;
.
.
.
}
然后能够将它们反序列化为各自类的新实例:
JAXBContext EQLGameSettingsContext = JAXBContext.newInstance("EQLGameSettings"),
EQLScoreSettingsContext = JAXBContext.newInstance("EQLScoreSettings");
Unmarshaller UM = EQLGameSettingsContext.createUnmarshaller();
File settingsXML = new File("path/to/Settings.xml");
EQLGameSettings = (EQLGameSettings) UM.unmarshal(settingsXML);
//And then be able to use the same file with and get a Score Settings instance like so:
UM = EQLScoreSettingsContext.createUnmarshaller();
EQLScoreSettings = (EQLScoreSettings) UM.unmarshal(settingsXML);
这样行吗?或者,即使尝试在同一个XML文件中存储多个对象,是否每次都会重写它?或者接下来的工作会怎么样
@XMLRootElement(name = "GameSettings")
public class EQLGameSettings{
.
.
.
}
@XMLRootElement(name = "ScoreSettings")
public class EQLScoreSettings{
.
.
.
}
JAXBContext EQLGameSettingsContext = JAXBContext.newInstance("EQLGameSettings"),
EQLScoreSettingsContext = JAXBContext.newInstance("EQLScoreSettings");
Unmarshaller UM = EQLGameSettingsContext.createUnmarshaller();
File settingsXML = new File("path/to/Settings.xml");
EQLGameSettings = (EQLGameSettings) UM.unmarshal(settingsXML);
//And then be able to use the same file with and get a Score Settings instance like so:
UM = EQLScoreSettingsContext.createUnmarshaller();
EQLScoreSettings = (EQLScoreSettings) UM.unmarshal(settingsXML);
前面的任何一个或所有内容都可以工作吗?还是我必须为每个设置实例生成一个XML文件
编辑:看起来这不是一个选项。我仍然不想经历为每个设置类维护XML文件的痛苦。我的下一个想法是使用每个设置类,而是使其可序列化。因此,我可以这样做,而不是尝试将每个设置放入XML文件:
@XmlRootElement("Settings")
public class MasterSettings{
@XmlElement("GameSettings")
EQLGameSettings GameSettings;
@XmlElement("ScoreSettings")
EQLScoreSettings ScoreSettings;
}
JAXBContext SettingsContext = JAXBContext.newInstance("MasterSettings");
Unmarshaller UM = SettingsContext.createUnmarshaller();
File SettingsFile = new File("Path/To/Settings.xml");
MasterSettings Settings = (MasterSettings)UM.unmarshal(SettingsFile);
我很有信心这会起作用,但接下来我需要问的问题是,如何设置一个类,以便以这种方式序列化它?不可能在一个xml中序列化多个根元素。。e、 g
<parentA>
<child>
Text
</child>
</parentA>
<parentB>
<child>
Text
</child>
</parentB>
正文
正文
你可以这样试试
<wrapperElement>
<parentA>
<child>
Text
</child>
</parentA>
<parentB>
<child>
Text
</child>
</parentB>
</wrapperElement>
正文
正文
根必须始终为1。XML基于XSD,因此您不能这样说 有关更多信息,请参阅
但是在中有一个解决办法,请允许我说事情比你想象的要简单得多:) 编写一个Java类,该类反映要存储在一个XML文件中的所有内容的结构。根据你漫无边际的描述,它可能类似于下面的类。(请注意,我正在演示如何实现一个重复元素——如果只需要一次引用,请使用其他模式)
@XmlRootElement(“设置”)
@XmlAccessorType(XmlAccessType.PROPERTY)
公共类设置{
私人列表游戏设置;
私人计分;
@XmlElement
公共列表getGameSetting(){
如果(游戏设置==null){
gameSetting=新建ArrayList();
}
返回游戏设置;
}
@XmlElement
public ScoreSetting getScoreSetting(){
返回分数设置;
}
公共无效设置分数设置(分数设置值){
分数设置=数值;
}
}
然后,您就有了GameSetting和ScoreSetting类,非常像这个(但是您可以省略@XmlRootElement
)
您可以构建对象层次结构,并封送一个
设置的单个对象,仅此而已。解组后,您可以访问项目和子项目。使用xml时,您几乎需要读/写整个文档。您应该用所有类创建一个层次结构,并将其作为一个实例进行读/写。@jtahlborn当您说“用所有类创建一个层次结构”时,我不确定我是否理解您的意思。我打算创建一个“主设置”类,将所有设置类合并到一个对象中,但我认为在每个设置类中都有每个值的访问器是多余的。那是指你说的,还是别的什么?
@XmlRootElement("Settings")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Settings {
private List<GameSetting> gameSetting;
private ScoreSetting scoreSetting;
@XmlElement
public List<GameSetting> getGameSetting(){
if( gameSetting == null ){
gameSetting = new ArrayList<>();
}
return gameSetting;
}
@XmlElement
public ScoreSetting getScoreSetting(){
return scoreSetting;
}
public void setScoreSetting( ScoreSetting value ){
scoreSetting = value;
}
}