有一个简单的POJO-
内部Category
带有Set<Category>
子类别。嵌套可能会很深,因为每个子类别都可能包含子子类别,依此类推。我想Category
通过jersey
返回为REST资源,序列化为json(由jackson提出)。问题是,我不能真正限制序列化的深度,因此所有类别树都可以序列化。
有没有办法在完成第一级(即Category
具有其第一级子类别)后立即停止对杰克逊进行序列化的对象?
如果可以从POJO中获取当前深度,则可以使用具有限制的ThreadLocal变量来实现。在控制器中,在返回Category实例之前,请对ThreadLocal整数设置深度限制。
@RequestMapping("/categories")
@ResponseBody
public Category categories() {
Category.limitSubCategoryDepth(2);
return root;
}
在子类别getter中,您可以根据类别的当前深度检查深度限制,如果超过限制则返回null。
您可能需要以某种方式清理本地线程,也许是使用spring的HandlerInteceptor :: afterCompletition。
private Category parent;
private Set<Category> subCategories;
public Set<Category> getSubCategories() {
Set<Category> result;
if (depthLimit.get() == null || getDepth() < depthLimit.get()) {
result = subCategories;
} else {
result = null;
}
return result;
}
public int getDepth() {
return parent != null? parent.getDepth() + 1 : 0;
}
private static ThreadLocal<Integer> depthLimit = new ThreadLocal<>();
public static void limitSubCategoryDepth(int max) {
depthLimit.set(max);
}
public static void unlimitSubCategory() {
depthLimit.remove();
}
如果您无法从POJO获取深度,则需要制作深度有限的树状副本,或者学习如何编写自定义Jackson序列化器。
有一个简单的POJO-和
我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"
但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?
我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,
问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问
我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数: