1

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

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

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

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

谢谢!

4

2 回答 2

2
  1. 看看Null Object Pattern。您可以使用额外的类来表示您的类型的 Null 实例,并且仍然可以包含有关其自身的信息。

  2. 有一种叫做Class Token的东西,它使用 Class 对象作为异构容器的键。查看Joshua Bloch 撰写的 Effective Java,第 29 条。我不确定这种方法如何为您工作,因为您可能有许多相同类型的实例,但我将其作为参考。

于 2012-08-07T14:34:48.410 回答
0

首先,您能解释一下为什么要对属性使用 JSON 序列化吗?

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

我对这种情况的解决方案是包含以下列的简单表:

  1. id - 整数
  2. 属性名 - varchar

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

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

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

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

于 2018-06-21T14:50:07.633 回答