我们有一个非常大的对象图(在正常程序执行期间通过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?
答案 0 :(得分:1)
我只是设法回答了我自己的问题:)
我做错了是试图在班级停止对象图导航。
您需要做的事情是断开导航是在个别关系/属性的级别上执行此操作,您不希望SnakeYaml在序列化期间导航到其他位置。
所以而不是
if (javaBean instanceof Role) {
return null;
我需要做
if (javaBean instanceof ClassWithAttribute && property.getName().equals("classAttributeName"))
return null;
其中: