【问题标题】:Preventing the "serializing the whole world" issue for large object graph in SnakeYaml防止 SnakeYaml 中大型对象图的“序列化整个世界”问题
【发布时间】:2018-04-04 19:48:39
【问题描述】:

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

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

我发现了 SnakeYaml 'Representer' 类,它看起来像一个钩子,可让您指定“不”来序列化特定 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?

【问题讨论】:

    标签: snakeyaml object-graph


    【解决方案1】:

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

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

    您需要做的是在序列化过程中不希望 SnakeYaml 导航超出的单个关系/属性级别来中断导航。

    所以而不是

    if (javaBean instanceof Role) {
        return null;
    

    我需要做的

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

    地点:

    • “ClassWithAttribute”是有关系的类名 您不希望序列化继续进行。
    • “classAttributeName”是超出关系属性的名称 您不希望序列化继续进行。

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 2017-07-21
      • 2011-03-23
      • 1970-01-01
      • 2011-08-03
      • 2022-12-11
      • 1970-01-01
      • 2014-11-21
      相关资源
      最近更新 更多