gson序列化时如何排除字段

How to exclude fields during serialization of gson

我有两个实体:OrderItem 处于 OneToMany 关系中。 Item属于一个Order,Order有一组Items。

class Order{
     @OneToMany(fetch = FetchType.EAGER, mappedBy = "id_order")
     Set<Item> items;
}

class Item{
     @ManyToOne(targetEntity = Order.class, fetch = FetchType.LAZY)
     @JoinColumn(name = "id_order")
     Order id_order;
}

我使用 gson 序列化 Orders 并将它们发送到另一台机器,但是在序列化过程中创建了一个循环,因为订单和项目都相互引用。

我的目标是当加载 Item 时,字段 id_order 应该是 null 或仅包含 id,以避免传播。 hibernate 是否支持此功能?或者我可以在序列化期间排除该字段吗?

我已经在 Item 上尝试了 FetchType.LAZY 并在 onLoad() Interceptor 中捕获 Item 并将其 id_order 设置为 null。但它没有用。我试图避免在每次查询时编写自定义适配器或手动解析所有订单中的所有项目。

我相信它与 Hibernate 的关系不大,但与 GSON 的关系更多。您应该定义 serialization/deserialization 规则。

最简单的方法是使用 @Expose 注释,从 serialization/deserialization:

给定 属性 include/exclude
@Expose(serialize = false, deserialize = false)

另一种方法是为 givenclass 定义自定义适配器。使用适配器,您可以完全覆盖 GSON 序列化或反序列化对象的方式。

例如:

public class YourAdapter implements JsonDeserializer<Order>, JsonSerializer<Order> {
    @Override
    public Orderde serialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
    // your logic
    }

    @Override
    public JsonElement serialize(Ordersrc, Type typeOfSrc, JsonSerializationContext context) {
        // your logic
    }
}

最后初始化 Gson 解析器的实例:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Order.class, new YourAdapter())
        .build();

如果你想避免编写整个序列化,你可以使用 @Expose 排除你的字段,然后编写带有纯 GSON 实例的适配器,serialize/deserialize 使用那个纯实例并手动添加一个字段。

另一种处理 serialization/deserialization 问题的方法是使用此处描述的 ExclusionStrategyhttps://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html

我知道这并不能直接回答问题,但可能会对其他人有所帮助,GSON 有一个基于变量修饰符排除的选项。

Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PRIVATE).create();