java 中序列化NotSerializableException问题解决办法

 更新时间:2017年08月28日 11:33:26   作者:54powerman  
这篇文章主要介绍了java 中序列化NotSerializableException问题解决办法的相关资料,这里对序列化问题进行描述说明,并提供解决办法,希望能帮助到大家,需要的朋友可以参考下

java 中序列化NotSerializableException问题解决办法

前言:

某项目中,要将某个自定义类MMessage对象,通过ObjectOutputStream和ObjectInputStream传递,该MMessage的特征描述:

1 该类未继承Serializable接口;

2 其父类Message的父类继承了Serializable接口;

3 其父类中有一个字段类型为Java.io.ByteArrayOutputStream类型;

经测试发现,MMessage类序列化过程中,会抛出NotFoundSerializableException,提示如下:

Exception in thread "main" java.io.NotSerializableException: java.io.ByteArrayOutputStream

错误排查:

1 从错误来看,首先想到了看一下MMessage是否继承了Serializable接口,发现其父类的父类继承了Serializable接口,理论上,作为子类的MMessage也应该是可以被序列化的;

2 测试序列化其父类以及父类的父类,发现其父类的父类,可以被序列化,但其父类无法序列化;

3 从上面的分析,问题出在其父类上。再仔细查看错误提示,并分析其父类Message的成员,断定是ByteArrayOutputStream成员无法被序列化(重新定义一个测试用例测试,验证了这一断言)。

4 修改Message类的成员ByteArrayOutputStream buff为transient类型,问题解决。

错误分析:

如果一个类的某个字段不需要被序列化,需要标注该字段为transient类型。适用的情况:

1 该字段为Object,而且该Object不能修改,且不可序列化;

2 该字段为可序列化类型,但它是敏感信息,如密码;

3 该字段为临时变量,如buffer,不需序列化;

例(代码片段):

public class SupperMessage implements Serializable
{
 //......
}
public class Message extends SupperMessage
{
 transient private java.io.ByteArrayOutputStream buff;//此对象无法序列化,且无法更改
 //......
}
public class MMessage extends Message
{
 private String contentId;
 private String user;
 transient private String pass;//敏感信息
 transient private String reserve;//不关心该字段,不需要序列化
 //......
}

类MMessage中标记为transient的成员,不会被序列化。

以上就是java 中序列化NotSerializableException问题解决办法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Java9新特性Java.util.Optional优化与增强解析

    Java9新特性Java.util.Optional优化与增强解析

    这篇文章主要为大家介绍了Java9新特性Java.util.Optional优化与增强使用说明解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • java基于ConcurrentHashMap设计细粒度实现代码

    java基于ConcurrentHashMap设计细粒度实现代码

    这篇文章主要介绍了java基于ConcurrentHashMap设计细粒度实现代码,通过ConcurrentHashMap实现细粒度,具有一定参考价值,需要的朋友可以了解。
    2017-10-10
  • Java import导入及访问控制权限修饰符原理解析

    Java import导入及访问控制权限修饰符原理解析

    这篇文章主要介绍了Java import导入及访问控制权限修饰符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • idea out目录与target目录的区别详解

    idea out目录与target目录的区别详解

    这篇文章主要介绍了idea out目录与target目录的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java 函数编程详细介绍

    Java 函数编程详细介绍

    这篇文章主要介绍了Java函数式编程,lambda表达式可以被认为是一个匿名函数,可以在函数接口的上下文中使用。函数接口是只指定一个抽象方法的接口,下面来看文章的详细内容,需要的朋友可以参考下
    2021-11-11
  • spring boot 动态生成接口实现类的场景分析

    spring boot 动态生成接口实现类的场景分析

    本文不具体介绍动态代理,主要看一下它在springboot项目中的实际应用,下面我们模仿feign来实现一个调用三方接口的 httpclient,感谢的朋友跟随小编一起看看吧
    2021-11-11
  • IDEA2023隐藏.idea和.iml文件的实现步骤

    IDEA2023隐藏.idea和.iml文件的实现步骤

    IDEA新建项目会自动生成一个.idea文件夹和.iml文件,本文主要介绍了IDEA2023隐藏.idea和.iml文件的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 全面分析Java文件上传

    全面分析Java文件上传

    本片文章给大家详细分析了Java文件上传的相关知识点,以及相关代码做了详细分析,有兴趣的朋友学习下。
    2018-02-02
  • Java设计模式之原型模式的示例详解

    Java设计模式之原型模式的示例详解

    原型模式(Prototype Pattern)指使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。本文将通过案例详细讲解一下原型模式,感兴趣的可以了解一下
    2022-02-02
  • 浅谈JMeter engine启动原理

    浅谈JMeter engine启动原理

    本文主要介绍jmeter在控制台在点击执行之后底层所做的一些主要事情及内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论