为了Json存储字,然后反序列化为Map(不是自定义的常规对象) 比如某二方为了提供通用的接口能力,将Map的数据通过JSON序列化方式缓存然后JSON反序列化拿到Map。 等情况。...java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 二、上代码 @Test(expected...ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(object);...objectInputStream = new ObjectInputStream(byteArrayInputStream); return objectInputStream.readObject...四、思考 总之开发中尽量不要乱用一些对象属性转换工具,导致属性漏掉或者转错。 不要滥用Map或者JSONObject来传递参数。 如果是含Object类型JSON序列化要特别小心上述问题!
但是在继承对象之间的强制转换可能会遇到 java.lang.ClassCastException 异常的错误。...dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException...module of loader org.springframework.boot.loader.LaunchedURLClassLoader @4ee285c6)] with root cause java.lang.ClassCastException...上面的原因是父类的对象是由父类创建的,然后你尝试将父类创建的对象强制转换到子类中。...因为父类创建的对象和子类需要创建的对象分别使用不同的地址空间,那在转换的时候将会出现地址空间引用的错误,因此 JVM 会认为你将 2 个完全不同类型的对象进行转换,这个时候出现上面的运行时错误。
1.5 ObjectOutputStream的用法 马 克-to-win:顾名思义,ObjectOutputStream一定是用来往输出流上写用户自定义的对象的。...比如数据库中某表的一行数据对应一个对 象,这时可通过这种方法存在硬盘上。一定要注意ObjectOutputStream与ObjectInputStream必须配合使用,且按同样的顺 序。...例子参见ObjectInputStream那部分的描述。 更多请见:https://blog.csdn.net/qq_44639795/article/details/102531120
defaultReadObject方法通过数据流中的信息,把当前类保存在数据流中的字段信息分配到相对应的字段名(也就是说把字段的值分配给相对应的字段名)。这种处理方式也能处理该类新增字段的情况。...通过writeObject方法把对象Object的各个字段写入到ObjectOutputStream中,或者通过使用DataOutput支持的基本数据类型的方法来保存该Object对象的状态信息。...在序列化对象时,其类的方法中如果有writeReplace标签方法存在的话,则该标签方法会在序列化写入时被调用。...当从数据流中读取一个实例的时候,指定替换的类需要实现此特殊方法。...,并且在数据传递过程中或者使用时能够保证数据结构或者对象状态的完整性和可传递性,即在网络上传送对象的字节序列。
反序列化过程需要执行对象的readObject方法,也就是需要找到一个类的readObject方法能调用transform方法从而触发一系列回调,而这个类就是sun.reflect.annotation.AnnotationInvocationHandler...,它的readObject方法如下 private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException...中的readObject函数,具体可以看下面这篇文章:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/f8a528d0379d 改动后,不再直接使用反序列化得到的...在TransformerMap链中,AnnotationInvocationHandler类中的readObject方法中会调用Map中的setValue方法从而进行一系列回调,但AnnotationInvocationHandler...类中的readObject方法中并没有直接调用Map中的get方法,而是在AnnotationInvocationHandler类中的invoke方法中有调用到get。
序列化:(方便在磁盘上存储或者在网络上传输)把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。...,在fastjson将对象转为字符串的过程中不会修改属性的访问修饰符,transient修饰的字段也不会参数转字符串) @Data public class Person implements Serializable...= (Person) in.readObject(); System.out.println("readObject = " + readObject);...(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178...serialVersionUID,这种方式的缺点是它会基于类的结构自动生成一个 serialVersionUID,可能会因为类的修改而改变。
上文中实现了序列化和逆序列化一个简单的Name对象,下面来看一个稍复杂的情况,Name类中复合了其它类。 ...,那我们如何让不能序列化的类NickName中的name属性可以序列化和反序列化呢?...在序列化和反序列化过程中需要特殊处理的类必须使用下列准确签名来实现特殊方法: private void writeObject(java.io.ObjectOutputStream out) throws...writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。...通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。readObject 方法负责从流中读取并还原类字段。
这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...ObjectOutputStream 从code 4中,我们可以看出,对象的序列化过程通过ObjectOutputStream和ObjectInputputStream来实现的,那么带着刚刚的问题,我们来分析一下...ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。
这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...用户自定义的 writeObject 和 readObject 方法可以允许用户控制序列化的过程,比如可以在序列化的过程中动态改变序列化的数值。...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...那么如果一个类中包含writeObject 和 readObject 方法,那么这两个方法是怎么被调用的呢?...ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?
中最重要的方法是: public final Object readObject() throws IOException, ClassNotFoundException; 此方法可以读取字节流并将其转换回...文件“yourfile.txt”在项目目录中创建。然后使用 FileInputStream 加载此文件。 ObjectInputStream 选取此流并将其转换为名为 p2 的新对象。...Java 中的自定义序列化 Java 指定序列化对象的默认方法,但 Java 类可以覆盖此默认行为。尝试序列化具有某些不可序列化属性的对象时,自定义序列化可能特别有用。...void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; 使用这些方法,可以将不可序列化的属性序列化为可以序列化的其他形式...结论 在这篇简短的文章中,回顾了 Java 序列化,讨论了注意事项,并学习了如何进行自定义序列化。
ObjectInputStream 类中:通过使用readObject()方法,从输入流中读取二进制流,转换成对象。 ...然后通过ObjectinputStream 类中的readObject()方法反序列化,获取对象。 ...2.3.2 第二种写入方式: 在Student 类中实现writeObject()和readObject()方法: private void writeObject(ObjectOutputStream...和 ObjectInputStream 类中的 writeObject()和readObject()方法 2.2 通过在序列化对象中实现writeObject()和readObject()方法,传入ObjectOutputStream...我们可以通过上述序列化方法中的 实现writeObject 和readObject 方法,在方法中调用输出流或输入流的writeUTF()和readUTF()方法。
Serializable java.io.ObjectOutputStream代表对象输出流 它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中...java.io.ObjectInputStream代表对象输入流 它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。...通过 ObjectOutputStream 将需要序列化数据写入到流中,因为 Java IO 是一种装饰者模式,因此可以通过 ObjectOutStream 包装 FileOutStream 将数据写入到文件中或者包装...对象输出流,将Person对象存储到F盘的Person.txt文件中,完成对Person对象的序列化操作 ObjectOutputStream oo = new ObjectOutputStream...对象输出流,将Person对象存储到F盘的Person.txt文件中,完成对Person对象的序列化操作 ObjectOutputStream oo = new ObjectOutputStream
ObjectOutputStream 1、简介 作用:将对象以流的方式写入到要保存的文件中,叫写对象,也叫对象的序列化; 2、构造方法 ObjectOutputStream(OutputStream out...中的writeObject方法,把对象写入到文件中; ③释放资源; 但是,只有这些是不对的!...("C:\\Users\\Administrator\\Desktop\\test.txt")); //②使用ObjectOutputStream中的writeObject方法,把对象写入到文件中...中的readObject方法,读取文件中保存的对象; ③释放资源; ④使用读取出来的对象(打印); 备注:有可能出现的异常ClassNotFoundException 所以使用反序列化的两个前提: ①类必须实现...readObject方法,读取文件中保存的对象; Object object1 = objectInputStream.readObject();//一次读一个对象 Object
以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。...ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。...解决 在序列化过程中,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化,如果没有这样的方法,则默认调用是ObjectOutputStream...用户自定义的 writeObject 和 readObject 方法可以允许用户控制序列化的过程,比如可以在序列化的过程中动态改变序列化的数值。...以下是自定义在 writeObject和readObject加密解密的过程 private void writeObject(ObjectOutputStream out) { try {
这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...writeObject 方法把 elementData 数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...ObjectOutputStream 从code 4中,我们可以看出,对象的序列化过程通过ObjectOutputStream和ObjectInputputStream来实现的,那么带着刚刚的问题,我们来分析一下...ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。
简单实现 Java在序列化对象时,将会调用这个对象的writeObject方法,参数类型是ObjectOutputStream,开发者可以将任何内容写入这个Stream中;反序列化时,也会调用这个对象的...另外在类中的readObject方法中也可以对写入的字符串进行操作,例如这里将其进行了打印。...This is a Person 在自定义的writeObject方法中,调用传入的ObjectOutputStream的writeObject方法写入的对象,会写入到objectAnnotation中...而自定义的readObject方法中,调用传入的ObjectInputStream的readObject方法读入的对象,则是objectAnnotation中存储的对象。...因为Java开发者(包括Java内置库的开发者)经常会在readObject方法中写⾃⼰的逻辑,所以导致可以构造利⽤链。
在 writeObject0() 方法中,跳过一些检查操作,直接分析最核心的这段代码。 1、 如果该对象是String、数组、枚举类型的,调用响应的方法进行写入。...readObject 方法 ?...1、提供给子类进行重写反序列化功能(readObject 方法是final的,但提供 readObjectOverride() 给子类去覆盖实现) 2、反序列化调用 readObject0() 方法去实现...判断用户是否实现了 readObject() 方法,如果实现,则执行用户自定义的发序列化方法。 ?...否则执行ObjectInputStream中默认的序列化方法 defaultReadFields(); 通过ObjectOutputStream 类的简单分析,我们就可以了解到 Serializable