java动态属性表

时间:2012-08-07 13:23:13

标签: java json serialization hashmap

我正在开发一个需要动态属性特殊组件的java应用程序。参数被序列化(使用JSON)并存储在数据库中,然后在运行时反序列化。所有属性都显示在具有3列(属性名称,属性类型和属性值)的JTable中,并存储在散列映射中。

我目前有两个问题需要解决:

  1. hashmap也可以存储对象,对象可以设置为null。如果设置为null,我不知道它们属于哪个类。我怎么能存储对象,即使它们是null并且知道它们属于哪个类?我是否需要将每个对象包装在一个将保存存储对象类的类中?

  2. 在运行时从json反序列化对象。这个问题是有很多不同类型的对象,我实际上并不知道将存储在hashmap中的所有对象类型。所以我正在寻找一种动态反序列化对象的方法..有这样的方法吗?我是否必须将对象的类存储在序列化的json字符串中?

  3. 谢谢!

2 个答案:

答案 0 :(得分:2)

  1. 查看空对象模式。您可以使用额外的类来表示类型的Null实例,并且仍然可以包含有关其自身的信息。

  2. 有一种称为类令牌的东西,它使用Class对象作为异构容器的键。看一下 Effective Java作者:Joshua Bloch,第29项。我不确定这种方法对你有用,因为你可能有很多相同类型的实例,但我把它留作参考。

答案 1 :(得分:0)

首先,您能说明为什么要对属性使用JSON序列化吗?

在我看来,此方法在很多方面都是不利的,它可能导致数据库搜索和索引编制问题,使数据库查看变得痛苦,并导致应用程序中不必要的代码。这些问题可能不是问题,这取决于您要如何使用属性。

我针对此类情况的解决方案是包含以下列的简单表:

  1. id-int
  2. 属性名称-varchar

然后为每种受支持的数据类型添加列:

  1. string_value-varchar
  2. 整数值-整数
  3. date_value-日期

...以及您想要的任何其他类型。

此设计使用简单且类型安全的ORM映射可实现最高性能,而无需任何序列化或其他模板。它可以存储任何类型的值,您只需为属性类型设置正确的列即可,其他所有属性都保留为null。您可以通过在所有数据列中使用null来模拟null值。索引和搜索也变得轻而易举。