对于 Java 对象实例的序列化,我使用 Jackson 库并构建了几个 JsonSerializers,它们应该单独检查
Player.class
、Vehicle.class
和 Building.class
并相应地转换它们。我将侦听器注册为 SimpleModules,然后通过 ObjectMapper 使用 convertValue()
映射实例。
然而,这个过程实际上效果很好。映射器独立识别类的相应实例出现的位置,并将它们通过注册的序列化器传递。
然而,我的问题是它不再在一定级别的渐变水平上工作。如果车辆直接位于玩家对象的列表中,则它们会被序列化。但是,如果它们低一级,即在播放器实例的另一个列表的项目中(参见
parkedVehicles
),则序列化器将不再识别它们。
Player p = ...;
ObjectMapper mapper = new ObjectMapper().configure(MapperFeature.REQUIRE_SETTERS_FOR_GETTERS, true);
ObjectNode objectNode = mapper.createObjectNode();
SimpleModule module = new SimpleModule();
module.addSerializer(Player.class, new PlayerSerialization());
module.addSerializer(Building.class, new BuildingSerialization());
module.addSerializer(Vehicle.class, new VehicleSerialization());
mapper.registerModule(module);
objectNode.set("player", mapper.convertValue(p, ObjectNode.class));
我做了一些进一步的研究并尝试了一下,发现了一个新问题: 只要将相应的对象直接传递给
mapper.convertValue()
,转换器/序列化器似乎就可以工作。 任何类型的嵌套都会导致序列化器的无知。例如:
objectNode.set("you", mapper.convertValue(event.getUser(), ObjectNode.class));
...不会像
headquarter
那样转换嵌套用户字段。它们只是默认打印。同时,如果我使用:
objectNode.set("you", mapper.convertValue(u.getHeadquarter(), ObjectNode.class));
...转换器将按预期应用并转换对象。
这里是一个使用 StdConverter 的示例,它不适用于注册侦听器类型的任何嵌套对象。
总结:我当前使用
StdConverter
的方法不适用于 任何类型的嵌套对象。它们只是默认打印。
我对造成的混乱感到非常抱歉,因此我原来的帖子似乎有点错误。
您知道如何处理嵌套对象以便正确转换它们吗? 😊