专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java修炼终极指南:132 避免在反序列化时出现StackOverflowError

temp10 2024-11-04 14:06:00 java教程 14 ℃ 0 评论

让我们考虑以下代码片段:

// 'mapOfSets' 是要序列化/反序列化的对象
HashMap<Set, Integer> mapOfSets = new HashMap<>();
Set<Set> set = new HashSet<>();
mapOfSets.put(set, 1);
set.add(set);

我们计划按照以下方式序列化mapOfSets对象(我假设Converters.objectToBytes()是从前面的问题中已知的):

Java修炼终极指南:132 避免在反序列化时出现StackOverflowError

byte[] mapSer = Converters.objectToBytes(mapOfSets); 

一切都很正常,直到我们试图反序列化mapSer。在那一刻,我们得到的不是有效的对象,而是以下StackOverflowError:

Exception in thread "main" java.lang.StackOverflowError
  at java.base/java.util.HashMap$KeyIterator
     .<init>(HashMap.java:1626)
  at java.base/java.util.HashMap$KeySet
     .iterator(HashMap.java:991)
  at java.base/java.util.HashSet
     .iterator(HashSet.java:182)
  at java.base/java.util.AbstractSet
     .hashCode(AbstractSet.java:120)
  at java.base/java.util.AbstractSet
     .hashCode(AbstractSet.java:124)
  ...

反序列化过程在Set的hashCode()方法中陷入困境。解决方案是创建一个过滤器,如果对象的图深度大于2,则拒绝反序列化。这可以是一个基于模式的过滤器,如下所示:

ObjectInputFilter filter = ObjectInputFilter.Config
  .createFilter("maxdepth=2;java.base/*;!*");

接下来,使用此过滤器调用反序列化过程:

HashMap mapDeser = (HashMap) Converters
  .bytesToObject(mapSer, filter);       

我假设Converters.bytesToObject()是从前面的问题中已知的。这一次,我们没有得到StackOverflowError,而是反序列化被过滤器拒绝了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表