NotSerializableException 问题描述: 想要写入对象的时候的时候回抛出NotSerializableException:类名 原因: 写入的对象没有序列化,即没有实现java.io.Serializable 瞬间)修饰的字段或方法都是不被序列化的,也就是保存到本地和从本地读取的时候都不会操作这个东西 二、类中引用到的其他类的对象也需要序列化,比如如果类中用了ObjectOutputStream的话,会抛出NotSerializableException
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.lewis.test; import java.io.NotSerializableException LOGGER.warning("a warning msg"); LOGGER.severe("a severe msg"); LOGGER.log(Level.INFO, "test1: a info msg", new NotSerializableException ()); LOGGER.log(Level.WARNING, "test1: a warning msg", new NotSerializableException()); LOGGER.log(Level.SEVERE , "test1: a severe msg", new NotSerializableException()); } 这里需要注意的是,tomcat-juli的打印语句也是不太一样的,如果需要打印出具体的堆栈信息就必须自己指定日志级别 severe msg Dec 07, 2018 5:56:05 PM com.lewis.test.TestLewis main SEVERE: test1: a severe msg java.io.NotSerializableException
org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:90) ... 34 more Caused by: java.io.NotSerializableException 通过异常栈可以得出有效信息: Caused by: java.io.NotSerializableException: com.ssm.promotion.core.entity.Article NotSerializable
比如现在catalina.out里有大量的NotSerializableException,这个exception是由第三方jar包打印出来的,log日志如下: 1 2 30-Oct-2018 17:53 session attribute [javax.zkoss.zk.ui.Session] for session [EB56FE915F0611E8195FF5F95C96A9E2.app2] java.io.NotSerializableException value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value) 我们需要将level设置成SEVERE,才可以不让其打印NotSerializableException
利用ObjectOutputStream和ObjectInputStream序列化和反序列化时一定要实现Serializable接口,否则会报NotSerializableException异常 public static int id; private String name; private int age; // 参与序列化的类也必须能序列化,否则会报 NotSerializableException name=大黄), car=null) 1 说明: 静态成员变量不能序列化(序列化) transient修饰的成员变量不参与序列化 参与序列化的引用类型也必须实现Serializable接口,否则会报NotSerializableException e.printStackTrace(); } } } @Data public class Pet { private String name; } java.io.NotSerializableException
报错了,提示了NotSerializableException,原因是我们在创建Person类时,并没有实现Serializable接口。 else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared);}// 如果对象不能被序列化,则抛出 NotSerializableException 异常else {if (extendedDebugInfo) { throw new NotSerializableException( cl.getName() + "\n" + debugInfoStack.toString());} else { throw new NotSerializableException(cl.getName());}}从这段源码中我们可以发现 ,在序列化的时候,writeObject0方法内部会对对象进行类型判断,包括字符串、数组、枚举或Serializable,这些条件都不满足的话,就会抛出NotSerializableException异常
unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException
对象转换成可在网络中传输或可写入磁盘的一个字节序列 反序列化:将一个字节序列转换为 Java 对象,便于在程序中使用 序列化有一条规则,就是要序列化的对象必须实现Serializbale接口,否则就会报 NotSerializableException 堆栈信息如下: java.io.NotSerializableException: com.zhang.model.Woman at java.io.ObjectOutputStream.writeObject0 异常 if (extendedDebugInfo) { throw new NotSerializableException( cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName 如果都不是则抛出 NotSerializableException 异常 加入Woman类实现了Serializable接口,就可以成功序列化和反序列化了 /** * @Author: ZhangGongMing
指定字符集读写数据(JDK11之后已淘汰) 字节流想要使用字符流中的方法了 序列化 序列化流的小细节 当要序列化多个对象时,我们可以把对象放到集合中,反序列化时更简洁 使用对象输出流将对象保存到文件时会出现NotSerializableException 否则,会出现NotSerializableException异常 ②序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了 序列化流/反序列化流的细节汇总 ①使用序列化流将对象写到文件时 否则,会出现NotSerializableException异常 ②序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了 ③序列化对象后,修改了Javabean类,再次反序列化,会不会有问题
exception is org.springframework.core.serializer.support.SerializationFailed 在学习Shiro使用缓存时,出现: java.io.NotSerializableException // 获取用户的盐值 //ByteSource salt = ByteSource.Util.bytes(user.getSalt()); //旧代码会抛出NotSerializableException
相反,当一个对象引用另一个对象时,这些对象必须单独实现 Serializable 接口,否则将引发 NotSerializableException: public class Person implements private Address country; // must be serializable too } 如果可序列化对象中的一个字段由对象数组组成,则所有这些对象也必须是可序列化的,否则将引发 NotSerializableException 请注意,必须将不可序列化的属性标记为瞬态,以避免 NotSerializableException。 4.
序列化过程中抛出异常啦,堆栈信息如下: Exception in thread "main" java.io.NotSerializableException: com.example.demo.Student 还是 Serializable,如果都不是的话,抛出 NotSerializableException异常。 desc, unshared); } else{ //其他情况会抛异常~ if (extendedDebugInfo) { throw new NotSerializableException cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException 序列化运行,就报NotSerializableException异常啦 Exception in thread "main" java.io.NotSerializableException: com.example.demo.Teacher
data")); //序列化时name字段是Optional类型,不支持序列化,报如下异常: //Exception in thread "main" java.io.NotSerializableException System.out.println(age); } } 平时这样使用一点问题也没有,但是当遇到序列化时,就会曝出Exception in thread "main" java.io.NotSerializableException 因为,Java 官方根本就不推荐 Optional 用在实体属性上,这也是 Java 设计出 NotSerializableException 异常的原因之一。
在序列化过程中,可能会遇到不支持可序列化接口的对象,在此情况下,将抛出 NotSerializableException,并将标识不可序列化对象的类。 如将Nickname.java去掉Serializable接口,再次运行WriteObject.java,会抛出如下异常: Exception in thread "main" java.io.NotSerializableException
序列化和反序列化会抛出NotSerializableException(没有序列化)异常; 类通过实现 java.io.Serializable 接口以启用其序列化功能。 Serializable接口也叫标记型接口:要进行序列化和反序列化的类,通过实现这个接口,获得一个标记,当类进行序列化或者反序列化操作时若有此标记则可以进行序列化或者反序列化,若没有这个标记,则会报NotSerializableException
java.io.NotSerializableException: thinking.in.java.common.User at java.io.ObjectOutputStream.writeObject0 writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException ( cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException
接口的定义: 1 public interface Serializable { 2} 读者可以尝试把code 1中的继承Serializable的代码去掉,再执行code 2,会抛出 java.io.NotSerializableException ; 9 } else { 10 if (extendedDebugInfo) { 11 throw new NotSerializableException cl.getName() + "/n" + debugInfoStack.toString()); 13 } else { 14 throw new NotSerializableException ()); 15 } 16 } 在进行序列化操作时,会判断要被序列化的类是否是Enum、Array和Serializable类型,如果不是则直接抛出 NotSerializableException 否则将抛出 NotSerializableException 异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种
Serializable接口的定义: public interface Serializable { } 读者可以尝试把code 1中的继承Serializable的代码去掉,再执行code 2,会抛出java.io.NotSerializableException unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException cl.getName()); } } 在进行序列化操作时,会判断要被序列化的类是否是Enum、Array和Serializable类型,如果不是则直接抛出NotSerializableException 否则将抛出NotSerializableException异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。
堆栈信息看一下 ObjectOutputStream 在序列化的时候,会判断被序列化的Object是哪一种类型,String array enum 还是 Serializable,如果都不是的话,抛出 NotSerializableException , unshared); } else{ //其他情况会抛异常~ if (extendedDebugInfo) { throw new NotSerializableException cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException
java.io.NotSerializableException: thinking.in.java.common.User at java.io.ObjectOutputStream.writeObject0 writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException ( cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException