防止"序列化整个世界" SnakeYaml中的大对象图的问题

时间:2018-04-04 19:48:39

标签: snakeyaml object-graph

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

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

我找到了SnakeYaml' Representsenter'这个类看起来像一个钩子,让你指定" not"序列化一个特定的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?

1 个答案:

答案 0 :(得分:1)

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

我做错了是试图在班级停止对象图导航。

您需要做的事情是断开导航是在个别关系/属性的级别上执行此操作,您不希望SnakeYaml在序列化期间导航到其他位置。

所以而不是

if (javaBean instanceof Role) {
    return null;

我需要做

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

其中:

  • " ClassWithAttribute"是具有关系的类的名称 超出此范围,您不希望序列化继续进行。
  • " classAttributeName"是超出的关系属性的名称 您不希望序列化继续进行。