【发布时间】:2011-11-19 20:28:47
【问题描述】:
如何使用java.util.properties 存储ArrayList 和/或HashMap 变量?如果不可能,我可以使用什么其他类来存储应用程序配置?
【问题讨论】:
标签: java properties arraylist hashmap configuration-files
如何使用java.util.properties 存储ArrayList 和/或HashMap 变量?如果不可能,我可以使用什么其他类来存储应用程序配置?
【问题讨论】:
标签: java properties arraylist hashmap configuration-files
如果您只是需要将您的集合序列化为字符串,我强烈推荐XStream。它使用反射将类序列化为 XML。如果默认行为不适用于您要序列化的类,则有文档,但到目前为止,以下内容每次都对我有用:
XStream xstream = new XStream();
String xml = xstream.toXML(myObject);
MyClass deserializedObject = (MyClass)xstream.fromXML(xml);
assert deserializedObject.equals(myObject);
【讨论】:
所以...如果“不要这样做”对您不起作用,那么您需要以某种方式对数据进行编码。一种常见的技术是在每个元素的名称前添加一些字符串。例如,如果我有一个包含 a->1、b->2、c->3 的地图 MyMap,我可能会存储在属性文件中:
MyMap.a=1
MyMap.b=2
MyMap.c=3
对于列表,您也可以这样做,只需将索引映射到值。所以如果 MyList 包含 {a,b,c}
MyList.0=a
MyList.1=b
MyList.2=c
这是一个hack,其他人说的都是真的。但有时你必须做你必须做的。
【讨论】:
Properties 基本上是Map<String, String> 意味着键和值都必须是字符串对象。如果您想要更高级的配置,您可以使用 Spring。它是一个出色的框架,我在每个项目中都使用它。 Spring 配置文件非常灵活。
【讨论】:
java.util.Properties 仅用于字符串键和值。它确实从 Hashtable 继承了 put() 和 putAll() 方法,但使用它们来“作弊”很少是一个好主意。您是否考虑过仅将配置信息存储在 HashMap 而不是 Properties 对象中?您必须稍微自定义序列化,但无论如何您都必须这样做,因为您无法利用 Properties 类的默认加载功能。
【讨论】:
存储 HashMap 很容易,因为 Map 中的每个键和值都可以由 Properties 对象中的相应键和值表示(请参阅 Properties 中的 setProperty 方法。
对于ArrayList,您可以执行类似的操作,键是索引,值是相应索引中的项目。
在这两种情况下,请记住属性文件只存储字符串,因此您必须设计一种方法将对象中的键和值表示为字符串。
【讨论】: