首页
学习
活动
专区
圈层
工具
发布

JSON序列化导致Long类型被搞成Integer经典巨坑

为了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序列化要特别小心上述问题!

1.7K30

Java 继承关系中的 java.lang.ClassCastException 错误

但是在继承对象之间的强制转换可能会遇到 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.9K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Serializable详解(1):代码验证Java序列化与反序列化

    defaultReadObject方法通过数据流中的信息,把当前类保存在数据流中的字段信息分配到相对应的字段名(也就是说把字段的值分配给相对应的字段名)。这种处理方式也能处理该类新增字段的情况。...通过writeObject方法把对象Object的各个字段写入到ObjectOutputStream中,或者通过使用DataOutput支持的基本数据类型的方法来保存该Object对象的状态信息。...在序列化对象时,其类的方法中如果有writeReplace标签方法存在的话,则该标签方法会在序列化写入时被调用。...当从数据流中读取一个实例的时候,指定替换的类需要实现此特殊方法。...,并且在数据传递过程中或者使用时能够保证数据结构或者对象状态的完整性和可传递性,即在网络上传送对象的字节序列。

    1.5K10

    Java安全之CommonsCollections1链

    反序列化过程需要执行对象的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。

    58360

    深入分析Java的序列化与反序列化

    这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...ObjectOutputStream 从code 4中,我们可以看出,对象的序列化过程通过ObjectOutputStream和ObjectInputputStream来实现的,那么带着刚刚的问题,我们来分析一下...ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。

    40350

    Java 序列化使用指南-Java快速入门教程

    中最重要的方法是: public final Object readObject() throws IOException, ClassNotFoundException; 此方法可以读取字节流并将其转换回...文件“yourfile.txt”在项目目录中创建。然后使用 FileInputStream 加载此文件。 ObjectInputStream 选取此流并将其转换为名为 p2 的新对象。...Java 中的自定义序列化 Java 指定序列化对象的默认方法,但 Java 类可以覆盖此默认行为。尝试序列化具有某些不可序列化属性的对象时,自定义序列化可能特别有用。...void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException; 使用这些方法,可以将不可序列化的属性序列化为可以序列化的其他形式...结论 在这篇简短的文章中,回顾了 Java 序列化,讨论了注意事项,并学习了如何进行自定义序列化。

    29800

    Java 序列化

    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

    1.4K00

    Java序列化流详解

    ObjectOutputStream 1、简介 作用:将对象以流的方式写入到要保存的文件中,叫写对象,也叫对象的序列化; 2、构造方法 ObjectOutputStream(OutputStream out...中的writeObject方法,把对象写入到文件中; ③释放资源; 但是,只有这些是不对的!...("C:\\Users\\Administrator\\Desktop\\test.txt")); //②使用ObjectOutputStream中的writeObject方法,把对象写入到文件中...中的readObject方法,读取文件中保存的对象; ③释放资源; ④使用读取出来的对象(打印); 备注:有可能出现的异常ClassNotFoundException 所以使用反序列化的两个前提: ①类必须实现...readObject方法,读取文件中保存的对象; Object object1 = objectInputStream.readObject();//一次读一个对象 Object

    21110

    java基础提升篇:深入分析Java的序列化与反序列化

    这里先给出结论: 在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化...writeObject 方法把 elementData 数组中的元素遍历的保存到输出流(ObjectOutputStream)中。...ObjectOutputStream 从code 4中,我们可以看出,对象的序列化过程通过ObjectOutputStream和ObjectInputputStream来实现的,那么带着刚刚的问题,我们来分析一下...ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?...答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。

    54540

    Java安全-反序列化-1-URLDNS

    简单实现 Java在序列化对象时,将会调用这个对象的writeObject方法,参数类型是ObjectOutputStream,开发者可以将任何内容写入这个Stream中;反序列化时,也会调用这个对象的...另外在类中的readObject方法中也可以对写入的字符串进行操作,例如这里将其进行了打印。...This is a Person 在自定义的writeObject方法中,调用传入的ObjectOutputStream的writeObject方法写入的对象,会写入到objectAnnotation中...而自定义的readObject方法中,调用传入的ObjectInputStream的readObject方法读入的对象,则是objectAnnotation中存储的对象。...因为Java开发者(包括Java内置库的开发者)经常会在readObject方法中写⾃⼰的逻辑,所以导致可以构造利⽤链。

    36440
    领券