2010-10-04 42 views
1

我有一个XML文件,它具有在其中定义的某些属性和映射。这些属性很少会改变。每次打电话使用我的jar文件时,我都不想重新加载和评估属性/映射。有什么方法可以将我的XML文件预编译到对象中,以便将XML值存储在对象中?每当我更改XML文件时,如果曾经,我只需要重新编译一次。“存储”一个对象,以备将来在Java中使用

+0

您是否试图避免在多次调用中多次解析XML,或者在同一次调用中多次解析XML?如果前者,请不要打扰。对于它所提供的价值来说,太过头疼了。 – 2010-10-04 13:55:25

+0

这是前者..但为什么不呢?主类将每分钟调用几次,每次尝试解析xml文件。在前一种情况下存储它应该不是更有利吗? – 2010-10-04 15:19:33

回答

2

您可以使用Java文件来定义这些开始的属性和映射。如果您不打算利用加载更改而无需重新编译,则无需混淆XML。

+0

你的意思是创建一个所有领域的类最终?但即使是“最终”对象,如果它们不是原始类型,它们在运行时会被评估吗? – 2010-10-04 15:24:52

+0

是的,这基本上就是我的意思。字符串文字不会被“在运行时评估”。也就是说,如果您担心创建地图或任何需要为此创建的数据结构的开销,那么您正在掌握过早的优化过程。每分钟几次并不是很多,我觉得你正在尝试根据你对没有实际测量的情况下会快或不快的想法进行优化。 – ColinD 2010-10-04 15:32:21

+0

感谢关于过早优化的警告。我确实倾向于经常这样做......是的,我想我应该先测量时间。其实我也可以为此使用java.util.Properties框架。性能比XML文件性能更好吗? – 2010-10-04 15:54:47

2

在将XML数据读入对象之后,可以使用Serialization将其写入文件,然后在加载XML源文件之前检查它是否已更改(通过比较它们的时间戳)。在XML源文件没有改变的情况下,你可以简单地通过从文件系统反序列化来恢复配置对象。

+0

谢谢......一旦我测量加载时间的差异,这似乎是最好的方法。 – 2010-10-04 15:50:40

1

这可能不被认为是世界上最好的做法......但如果你想在任何特定框架之外做到这一点,你总是可以使用简单的香草Java序列化。这正是你在谈论的内容......将对象存储到磁盘(或其他)并在稍后将其恢复到内存。如果主题不熟悉,请查看this tutorial

0

您可以将XML中的数据读取到java对象中,然后使用serialize那个对象。你甚至应该能够让你的对象检查XML文件的时间戳,并在它发生变化时自动重新读取它。

2

夫妇一个问题,可能会帮助你找到一个办法是:

  • 你有多大的XML文件?
  • 需要多长时间才能解析并将其转换为对象?
  • 每次加载图书馆时是否禁止将此过程(加载+解析+转换为对象)?

春天就是这样;您使用XML配置上下文,当您启动加载的应用程序时,根据您的配置分析并创建对象。我一直在处理Spring中的大XML文件,我可以说它非常快 - 考虑到它只在启动时执行过一次,所以它几乎不成问题。

Spring也有一个alternative其中你的配置是实际的代码,但我猜你想要坚持XML配置。

另一种方法是使用工具读取XML,将其转换为对象,然后使用对象序列化将此对象存储到文件中。然后您可以将该文件作为反序列化的对象加载。

+0

我的xml文件实际上是相当简单和小..约200个节点,包括属性..我仍然应该看看春季作为一个选项? (我现在对春天一无所知) – 2010-10-04 15:21:26

+0

春天是一个全新的(真棒)野兽,完全不同的目的;我刚刚提到它,它是如何工作的);如果它是一个如此小的文件,当你的库初始化时,我肯定会加载+解析+转换为对象(也称为缓存配置)。除此之外,其他任何东西都可能会导致性能下降。 – biasedbit 2010-10-04 15:46:44

+0

只要确保在每次需要某些信息时都不要解析XML文件! – biasedbit 2010-10-04 15:48:55

相关问题