首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JSON 多态反序列化属性类型丢失问题

一、背景 工作中有时候会遇到一个类定义了某个类型的父类作为成员变量,实际存放的为某个子类型, JSON 反序列化后,属性丢失的情况。 如果你赶时间,可以直接跳到第三部分看解决方案。...=Parent(name=张三, sex=男)) 这样存在的问题: 1、有时候我们会依据 Parent 的具体子类型来执行不同的策略,由于无法确定类型,给我们的编码带来了困扰 2、反序列化时,由于无法感知序列化时...Parent 类的具体类型,反序列化丢失了 other 成员变量的值。...三、解决办法 3.1 将子类型写入 JSON 字符串 先说一个常规做法。 如果我们在序列化时将具体的子类型写入到 JSON 字符串中,反序列化时就可以使用该子类型对其进行反序列化。...四、总结 本文主要讲 JSON 多态反序列化属性或类型丢失问题,并提供了几种解决方案,希望对大家有帮助。

4.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    源码分析kryo对java基础数据类型与Stirng类型的序列化反序列化机制

    序列化:将各种数据类型(基本类型、包装类型、对象、数组、集合)等序列化为byte数组的过程。 反序列化:将byte数组转换为各种数据类型(基本类型、包装类型、对象、数组、集合)。...java中定义的数据类型所对应的序列化器在Kryo的构造函数中构造,其代码截图: ? 接下来将详细介绍java常用的数据类型的序列化机制,即Kryo是如何编码二进制流。...Kryo对各数据类型的序列化与反序列化实现都是通过DefaultSerializers的内部类实现的。 IntSerializer int类型序列化。...下图展示了kryo用2个字节存储一个int类型的数据的示意图。 ? 同理,用3个字节可以表示2^21 -1。 kryo使用变长字节(1-5)个字节来存储int类型(java中固定占4字节)。...:char在java中使用2字节存储(unicode),kryo在序列化时,按大端字节的顺序,将char写入字节流。

    1.1K20

    Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法

    Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法 package com.example.core.mydemo.java; import....*; /** * Java序列化和反序列化 Serializable BeanUtils.copyProperties赋值属性方法 * Serialization(序列化):将java对象以一连串的字节保存在磁盘文件中的过程...,也可以说是保存java对象状态的过程。...序列化可以将数据永久保存在磁盘上(通常保存在文件中)。 * * deserialization(反序列化):将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化。...; private String lastName; //transient关键字表示有理的,被修饰的数据不能进行序列化 // private transient String

    9710

    MessagePack Java 0.6.X 多种类型变量的序列化和反序列化

    类 Packer/Unpacker 允许序列化和反序列化多种类型的变量,如后续程序所示。...这个类启用序列化和反序列化多种类型的变量和序列化主要类型变量以及包装类,String 对象,byte[] 对象, ByteBuffer 对象等的方法相似。...如上面提示的,你可以序列化和反序列化你自己的对象,前提是你自己的对象需要使用 @Message 注解。...例如,你希望将二进制数据反序列化为 boolean (或者 int) 数据类型,你可以使用 Unpacker 中的 readBoolean (或者 readInt) 方法。...Unpacker 同时也为参考变量提供了一个读取的方法。这个方法允许为一个参考变量从二进制数据中进行反序列化。参考变量的定义为你将类型指定为一个参数。

    57430

    更改类的属性类型后发现的坑org.apache.ibatis.type.TypeException: Could not set parameters for mapping

    背景 本次将一个类的属性从Integer改成String,上线后发现有这种报错org.apache.ibatis.type.TypeException: Could not set parameters...Cause:java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer...(java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap') 实际上有两个类 一个是...,但是如果传了就要保证正确,错误的写成了com.lingyejun.BrandCriterion,导致了上述报错。...将parameterType设置为自己实体类的路径com.lingyejun.Brand或者把parameterType删除 本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

    8910

    如何通过反射获取属性的名字和属性类型

    显然我们事先不知道要查哪个表,泛型dao的基本要求就是对所有的表都适用,这就需要我们动态的获取表名,基本思想可以是方法中传入一个类(前提是数据库中的表和实体类都是一一对应的)的实例,通过反射获取这个实体类中的属性名和属性类型...反射是java中一个很重要的特性,在不知道类中信息的时候,利用反射我们可以获取到类中所有的信息,例如属性名,属性类型,方法名,还可以执行类中的方法,很强大的,在框架中大多数也是采用反射获取类中的信息。...关于属性的信息都被获取到了,包括权限修饰符,属性类型,属性名,这里的String是java.lang.String,属性名和属性类型后面可以利用字符串截取获得实际想要的数据。...也可以直接获取到属性的类型,在Fileld类中有一个getGenericType方法: 在前面的for循环中加入下面这句话: String type = field.getGenericType().toString...(); 输出的是: int class java.lang.String class java.lang.String int 独立获取属性名: String name = field.getName(

    3.7K20

    Java 的序列化 与 反序列化

    在操作 Redis 遇到了 RedisTemplate 存储对象放进去 Redis中,取出来的时候,无法恢复成Java对象了。真他妈操蛋。耽误我半天时间,于是,准备狠狠的搞一手 序列化相关的问题。...序列化的定义 把对象转换为字节序列的过程称为: 对象的序列化 把字节序列恢复未对象的过程被称为:对象反序列化 为什么要序列化? 我们进行网络传输的时候,是以 二进制数据为单位的。...我们在传输的时候 就需要将对象 进行序列化 为字节,这样 我们就可也 进行传输了。...我们将来从Redis读取的字节时候,我们就需要转成Java 对象,我们才能用Java代码进行处理,所以,我们必须按照一个规矩 将对象 进行 所谓的 “加密” 然后 存储后。...我们读取的时候 再 “解密“。 “加密” 就叫 序列化 ,”解密” 就叫 反序列化。

    55520

    我攻克的技术难题:由Java属性名,getset 方法引起的序列化bug

    是基本数据类型的 boolean ,生成的 get 方法是 isActive , set 方法是 setActive ,很正常 但是你会发现这个 boolean isActive2 很不一样,它生成的...请问:你觉得这个是 lombok 的锅还是 java 本身的设计 为了排除嫌疑,我用 idea 自动生成 get/set ,结果它俩居然是一样的,那这个应该就是 java 的某种特点 了 不知道小伙伴们还记得...您猜怎么着,这反序列化的过程,居然不是直接使用我们定义好的属性字段,而是通过 get/set 方法去推测出来的!!...方法 ,会执行到一个 serializeFields 方法 (将字段进行序列化) _props 对应的五个属性如下 很明显这个 uname 就从这里出现的,最后得到的结果就如下了 解决办法也很简单...思考 到这里,我们就简单了解了这个 请求怎么反序列化成为一个对象,以及对象怎么序列化,对客户端进行响应的一个过程。

    49720

    Java的序列化与反序列化

    前言 Java的序列化与反序列化是Java中比较重要的一个知识,本文将总结一下,怎么使用序列化功能以及经常遇到的一些问题的解答....什么是Java的序列化 JDK提供给我们的,可以将某一个对象转化为二进制字节流保存,并从字节流恢复对象的一种技术. 我们可以再网络传输对象,或者持久化对象时使用这项技术....怎么进行序列化与反序列化 Java中通过继承Serializable接口来获得序列化与反序列化的能力,使用ObjectInputStream和ObjectOutputStream来进行具体的对象序列化读写...在看一些开源框架的代码时,发现他们的类都会有private static final long serialVersionUID = 8683452581122892189L;这个属性,这是用来干什么的呢...ArrayList实现了Serializable自然不必多说,其中用来保存数据的属性定义为: /** * The array buffer into which the elements of the

    61620

    修复Long类型太长,而Java序列化JSON丢失精度问题的方法

    Java序列化JSON时long型数值,会出现精度丢失的问题。 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)....解决办法一: 使用ToStringSerializer的注解,让系统序列化 时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class)...解决办法(二): 使用全局配置,将转换时实现自动ToStringSerializer序列化 Override public void configureMessageConverters(List<HttpMessageConverter...ObjectMapper objectMapper = new ObjectMapper(); /** * 序列换成json时,将所有的long变成string * 因为js中得数字类型不能包含所有的...java long值 */ SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer

    10.6K20
    领券