0

我们有一个非常大的对象图(在正常程序执行期间通过 DataNucleus ORM 从数据库延迟加载,所以通常没有问题)但我们只想用 SnakeYaml 序列化其中的一小部分——只是类的一小部分。

这些类之一与其他类之间存在关系,最终“到达”对象图中的大多数其他对象,这导致将几乎所有对象从数据库拉入 YAML 序列化流 - 经典的“序列化整个世界” “当您拥有数百万个您可以想象的可到达对象时,这个问题不会很好地结束:)

我发现了 SnakeYaml 'Representer' 类,它看起来像一个钩子,可以让您指定“不”来序列化特定 bean,但当它遇到该 bean 时,它看起来不像对象图导航过程中的断路器。它不会为该 bean 编写 YAML 输出,但 SnakeYaml 似乎会继续导航对象图经过该 bean。

private class CircuitBreakerRepresenter extends Representer
{

    @Override
    protected NodeTuple representJavaBeanProperty(Object javaBean, Property property,
                                                  Object propertyValue, Tag customTag) {

        // Intention: Don't navigate past the instances of 'Role' class when serializing
        // Outcome: Appears to continue navigating past 'Role' class instances
        if (javaBean instanceof Role) {
            return null;
        } else {
            return super.representJavaBeanProperty(javaBean, property, propertyValue,
                customTag);
        }
    }
}

有没有办法让 SnakeYaml 在序列化对象图时不导航到特定的 bean?

4

1 回答 1

1

我只是设法回答了我自己的问题:)

我做错的是试图在类级别停止对象图导航。

您需要做的是打破导航,在您不希望 SnakeYaml 在序列化期间导航超出的个人关系/属性级别执行此操作。

所以而不是

if (javaBean instanceof Role) {
    return null;

我需要做

if (javaBean instanceof ClassWithAttribute && property.getName().equals("classAttributeName"))
    return null;

在哪里:

  • "ClassWithAttribute" 是具有您不希望序列化继续进行的关系的类的名称。
  • “classAttributeName”是您不希望序列化继续进行的关系属性的名称。
于 2018-04-04T20:14:30.520 回答