【问题标题】:Is it possible to find the "referring/parent object(s)" when serializing?序列化时是否可以找到“引用/父对象”?
【发布时间】:2015-04-07 21:40:32
【问题描述】:

我们正在使用 OODBMS,它也允许 Java“实体”和序列化对象。数据库支持真正的图(没有“树”限制)并且序列化对象也可以安全地引用实体。数据库(几乎)透明地工作,我们可以做任何我们想做的事,而且它可以正常工作。

现在,我发现已被标记为“逻辑删除”的对象(使用简单的布尔标志,而不是内置的 DB 功能,因为 DB 没有这样的概念)被加载/保存在特定的对象图中。

我想知道哪些对象引用了那些“僵尸”对象。到目前为止,尝试使用反射来迭代图形还没有奏效。我可以简单地使用 Java 序列化来导出对象图,而不是 DB,这也会导致“僵尸”对象被序列化。

我的问题是:我能否以某种方式提取有关在序列化过程中引用“僵尸”对象(“父”对象)的对象的信息?可以有不止一个,但只要我有一个,我就可以迭代地工作,直到我杀死所有那些无效的引用。

【问题讨论】:

  • 您具体使用的是哪个 OODBMS?哪个版本?
  • 我们引入“逻辑删除”标志的真正原因是因为数据库不提供查找“父”对象的方法,因此也不为实体提供“GC”。长期目标是验证所有标记为逻辑删除的对象是否真正未被引用,因此我们最终可以删除它们。

标签: java serialization


【解决方案1】:

大多数 OODBMS 允许运行返回满足特定约束的对象引用的查询。所以你可以这样写:

return all objects
where deleted == true
and Foo.bar == this

其中Foo 是引用已删除对象的对象类型,bar 是包含引用的字段/属性。

确切的语法取决于您的 OODBMS。

【讨论】:

  • 确实,大多数是这样,但不是我们的(这是不点名产品的另一个原因;我不是想给他们做坏宣传),所以这不是我们的解决方案。此外,它仅适用于实体的“直接”引用,不适用于隐藏在序列化对象中的引用。
  • 在那种情况下,你需要接受现状或者给我更多的信息。注意:如果数据库可以序列化一个引用,那么它就不是“隐藏的”。如果它可以序列化引用,那么它也可以以某种方式查询它。没有这个,数据库甚至无法加载孩子。
  • 简单地说,DB服务器是运行查询的服务器,但对于服务器来说,序列化的对象只是字节数组。序列化对象的实际(反)序列化发生在客户端,这意味着可能需要许多服务器调用才能完全加载大型对象图,但这对我们来说都是透明的。这也意味着服务器不知道对这些字节数组中实体的引用。 DB 为实体使用统一的 ID 空间(64 位长),并在序列化期间将实体引用替换为“句柄”。我们不能修改 Handle 类。
  • 在这种情况下,我的解决方案将是第二个数据库服务器,它包装原始服务器并提供“高级”API。在该服务器上,您应该能够为序列化引用创建索引,这样您就可以保留它们的使用位置列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多