对于uni赋值我正在编写一个需要保存对象层次结构并将其加载到XML文件的java程序。例如,程序创建一个Zoo类,其中包含Animals的子类列表,将其保存为XML,并在下次用户启动程序时再次加载。
该文件可能看起来像
<Zoo>
<Animals>
<Lion>
<name>Leo</name>
<age>5</age>
<roar>fearsome</roar>
</Lion>
<Elephant>
<name>Dumbo</name>
<age>10</age>
<ears>let him fly</ears>
</Elephant>
</Animals>
</Zoo>
我需要支持少量有限数量的动物亚类(~5)。每个动物的子类都有各自的属性(如Ears和Roar)。我很困惑对象创建和文件创建的最佳设计模式是什么。
目前,我有一个类XMLCreator
,其中包含void createZooElement(Zoo)
,void createLionElement(Lion)
等方法,以及带有private Zoo createZoo(File)
,private Lion createLionObject(Element)
的XMLReader类
如果这是您希望将来由其他人维护的代码,这是一个很好的方法吗?或者每个对象应该有一个构造函数方法,它将File / Element作为参数,另一个方法返回File / XMLElement?哪种封装/可维护性最强?
答案 0 :(得分:9)
我只使用JAXB,它允许将对象树(带注释的类)编组为XML,并将XML解组为对象树。还有其他的Object to XML API,但是JAXB附带了Java SE并且运行良好。
答案 1 :(得分:2)
使用XStream,您可以序列化大多数Java对象,无需任何映射。对象名称成为生成的XML中的元素名称,类中的字符串构成XML的元素内容。使用XStream序列化的类不需要实现Serializable接口。 XStream是一个序列化工具,而不是数据绑定工具,这意味着它不会从XML或XML架构定义(XSD)文件执行类生成
答案 2 :(得分:1)
在我看来,您需要Builder
模式或Factory
模式。查看维基百科了解更多详情。我会选择Factory
模式,因为我对它更熟悉。我不是将其命名为XMLCreator
,而是将其命名为AnimalFactory
:
public class AnimalFactory () {
private static final AnimalFactory instance = new AnimalFactory ();
// I make this private so that I can be sure there is only one instance
// of the object. This is another pattern, the `Singleton`
private AnimalFactory () {};
// This is how you would access the instance
public static AnimalFactory getInstance () { return instance; }
// This is where you create the animal instances.
public Lion getLion () {...}
public Elephant getElephant () {...}
}
答案 3 :(得分:0)
你必须实现startElement ... endElement ......以及其他几个。
您可以更改解析策略,读取startElement方法中的元素。
我相信应该很容易。
This article读得很好。
此外,如果你不断创建像void createZooElement(Zoo)
这样的方法,你最终会在一天结束时使用无法管理的数百种方法。
答案 4 :(得分:0)