java中可能会引起序列化错误的几种方式

前言:何为序列化?序列化就是一种处理对象流的机制,即将对象的内容流化,将数据分解成字节流,以便存储在文件中或用于在网络中传输,用的最多的场景就是在多个进程之间进行数据通信。实现序列化只需让要实现的实体类实现Serializable接口即可,该接口并没有需要实现的方法,只是为了标识该类可被序列化。更多内容请参考文章(不在本文讨论范围):

https://blog.csdn.net/xlgen157387/article/details/79840134

今天在改某个bug时,被一个序列化问题整的头疼,便稍微记录下。一般当产生序列化问题时,日志中便会有具体的序列化错误对象及该对象中错误的字段,如果是字段序列化问题,只需对该字段的赋值操作进行慢慢断点调试你就能发现到底是哪一步神奇的操作引起的~

1、对象序列化错误

一般发生在改完实体类后,然后你redis又忘记清缓存,导致与现有代码中的实体类产生冲突,产生序列化错误。flushdb即可。

或者是你改变了某个jar包中的api类,该jar包又被多个进程所引用,而你只替换了某个进程,这也是一个原因。

2、字段序列化错误

1)下面该写法在跨进程时会产生序列化问题。可用谷歌的方法Lists.newArrayList("a","b");替代。

List list = new ArrayList(){{

add("a");

add("b");

}};

2)当使用如下代码复制一个list时可能会将原先的ArrayList类型给改变成RegularlmmutableAsList或是Single...List(具体类型突然给忘了,反正巨坑),可能还会有更多奇奇怪怪的类型,导致在将数据跨进程传输回去时会产生序列化问题。

ImmutableSet.copyOf(performers).asList();(注:performers为一个list)

Ps:像上述两种字段错误的方式都是因为其采用内部类及抽象类的方式在创建list,导致在进程通信之间产生序列化错误

3)ArrayList.subList()的结果是subList对象,不能被反序列化

你可能感兴趣的:(java)