序列化:找不到所需序列化对象的不可序列化组件

Posted

技术标签:

【中文标题】序列化:找不到所需序列化对象的不可序列化组件【英文标题】:Serialization: Can't find non-serializable component of desired serialized object 【发布时间】:2017-08-05 00:13:00 【问题描述】:

我得到了一个应该被序列化的对象。 Atm 我让它实现 Serializable 但在运行时我得到一个

Failed to marshal object with optimized marhshaller: $heresAhugeString$ 
Failed to serialize object:  $alsoHugeString$  
java.io.IOException: Externalizable class doesn't have default constructor: interface java.io.Externalizable 
Externalizable class doesn't have default constructor: interface java.io.Externalizable
java.io.Externalizable.<init>()   

最后一个异常(java.io.Externalizable.() 无限次出现) 我试图找到不可序列化的字段,但我只能看到它在序列化 ConcurrentHashMap 时引发异常。我知道这不是很多信息,但完整的堆栈跟踪非常大。 任何提示如何找出地图中的哪个字段负责非序列化?或者我应该添加哪些信息? 问候

【问题讨论】:

这对你有帮助吗 - Externalizable class doesn't have default constructor 但是不知道是指哪个类... @Abubakkar 是正确的。序列化时,需要默认构造函数来实例化序列化的类。你没有。 异常不会“无限次出现”。映射中的每个键或值都会出现一次。查看堆栈跟踪的末尾。 @EJP 我认为不是。但有可能。在调试器中有一行 cause = NoSuchMethodException@129509 并且它有一个具有相同行的孩子,依此类推......(id始终相同) 【参考方案1】:

我不知道你在做什么类型的反序列化,但是如果你解组后不需要使用这个字段,那么你必须将它设置为transient

transient java 关键字可以在你使用 Java 序列化时使用,@Transient 如果你使用 JPA,甚至 @JsonIgnoreProperties 如果你使用 Jackson

【讨论】:

以上是关于序列化:找不到所需序列化对象的不可序列化组件的主要内容,如果未能解决你的问题,请参考以下文章

反序列化异常:找不到程序集

Spring Boot Jackson ResponseEntity 找不到类的序列化程序

找不到使用 Json 的类的序列化程序

在构建版本中找不到数据类 Kotlin 的序列化程序

找不到源类型的查询模式的实现:反序列化服务响应时找不到选择

找不到符号可序列化?