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

面试被问Java序列化和反序列化为什么要实现Serializable接口

当我们只在本地 JVM 里运行下 Java 实例,这个时候是不需要什么序列化和反序列化的,但当我们需要将内存中的对象持久化到磁盘,数据库中时, 当我们需要与浏览器进行交互时,当我们需要实现 RPC 时,...前两个需要用到序列化和反序列化的场景, 是不是让我们有一个很大的疑问?...在反序列化时,JVM 会再根据属性自动生成一个新版 serialVersionUID,然后将这个新版 serialVersionUID 与序列化时生成的旧版 serialVersionUID 进行比较,...如果显示指定了 serialVersionUID, JVM 在序列化和反序列化时仍然都会生成一个 serialVersionUID, 但值为我们显示指定的值,这样在反序列化时新旧版本的 serialVersionUID...如果我们的类写完后不再修改,那当然不会有问题。 但这在实际开发中是不可能的,我们的类会不断迭代,一旦类被修改了,那旧对象反序列化就会报错。

53720

Jackson问题汇总

序列化时重命名字段 可以使用@JsonProperty来重命名字段,@JsonProperty能够在序列化和反序列化时给字段映射到指定的名字: 1 2 @JsonProperty("updatedBy"...) private String updateUserName; 如上,updateUserName在序列化为json时会被重命名为updatedBy,在反序列化时json中updatedBy的值会被映射到...") private String updateUserName; 如上,在反序列化时,json中的updatedBy或者updateUserName都可以映射到pojo的updateUserName...@JsonInclude用来指定序列化时需要包括哪些字段,本身提供了多种策略:ALWAYS、NON_NULL、NON_EMPTY等。...比如,现在需要对一个HashMap对象进行序列化,这个对象中的字段和类型是未知的,此时可以用@JsonSerialize和@JsonDeserialize来控制序列化和反序列化。

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

    6. 二十不惑,ObjectMapper使用也不再迷惑

    但需要注意的是:类的命名在很多地方仍旧使用了“JSON”这个词(比如JsonGenerator),尽管它与JSON格式没有实际的硬依赖关系。...功能介绍 ObjectMapper是jackson-databind模块最为重要的一个类,它完成了coder对数据绑定的几乎所有功能。...输出: Person(name=YourBatman, age=18) ObjectMapper的使用 在应用及开发中,ObjectMapper绝对是最常使用的,也是你使用Jackson的入口,本文就列列它的那些使用场景...反序列化场景有它特殊的地方,比如例子中所示:不能反序列化一个“单纯的”字符串。...,需要特别注意泛型擦除问题:若反序列化成为一个集合类型(Collection or Map),泛型会被擦除,此时你应该使用readValue(String content, TypeReference<

    1.7K30

    Java序列化和反序列化为什么要实现Serializable接口

    当我们只在本地JVM里运行下Java实例, 这个时候是不需要什么序列化和反序列化的, 但当我们需要将内存中的对象持久化到磁盘, 数据库中时, 当我们需要与浏览器进行交互时, 当我们需要实现RPC时, 这个时候就需要序列化和反序列化了...前两个需要用到序列化和反序列化的场景, 是不是让我们有一个很大的疑问?...在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功...如果显示指定了serialVersionUID, JVM在序列化和反序列化时仍然都会生成一个serialVersionUID, 但值为我们显示指定的值, 这样在反序列化时新旧版本的serialVersionUID...如果我们的类写完后不再修改, 那当然不会有问题, 但这在实际开发中是不可能的, 我们的类会不断迭代, 一旦类被修改了, 那旧对象反序列化就会报错.

    5610

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

    一、背景 最近遇到一个错误,就是某个字段肯定是Long类型的,通过Map方式转成JSON字符串,然后存到了DB的某个字段里。...为了Json存储字,然后反序列化为Map(不是自定义的常规对象) 比如某二方为了提供通用的接口能力,将Map的数据通过JSON序列化方式缓存然后JSON反序列化拿到Map。 等情况。...Assert.assertEquals(idValue, (Long) data.get(id)); String jsonString = JSON.toJSONString(data); // 反序列化时...https://blog.csdn.net/outsanding/article/details/80963646 提到“redis工具,在存java对象的时候,需要实体实现序列化。...Assert.assertEquals(idValue, (Long) data.get(id)); String jsonString = JSON.toJSONString(data); // 反序列化时

    1.4K30

    SHA指纹算法进行版本管理,解决对象流序列化与反序列化不兼容的问题

    试想一下,我们有这么一个应用场景,在反序列化的时候User类对象可能已经经过了多次的修改,版本已经升级过多次了,可能已经和当初序列化时的数据结构,类型,方法等均不一致了,从而导致无法正常进行反序列化。...java对象的序列化机制采取了SHA码的前8个字节作为类的指纹。在读入一个对象的时候,会拿着指纹与当前类的指纹比对,如果不匹配,说明这个类已经产生了变化,因此反序列化时会产生异常。...而使用SerialVersionUID后就指定了类的指纹一定就是这个了,所以反序列化的时候能够匹配上,但这也不代表就一定能反序列化成功,这又是为何呢?...当类被修改以后,假如只是修改了方法是不会影响反序列化的,但如果是变量就不一定了。...我们假设有这么一个场景,User类在修改前有一个属性,int a = 1; 修改后User类的属性变成了String a;那么这时候java的反序列化机制会自动匹配类型,匹配不成功就会自动转换其类型(将

    84730

    java 输入输出(学习笔记)

    值得提出的是,不管是文件还是目录都是使用File来操作的,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。...readObject()方法负责从流中读取并恢复对象实例变量,通过重写该方法,程序员可以完全获得对反序列化机制的控制,可以自主决定需要反序列化哪些实例变量,以及如何进行反序列化。...为了在反序列化时确保序列化版本的兼容性,最好在每个要序列化的类中加入这个类变量,具体数值自己定义。...新IO还提供了用于将Unicode字符串映射成字节序列以及逆映射操作的Charset类,也提供了用于支持非阻塞式输入/输出的Selector类。...使用Channel Channel类似于传统的流对象,但与传统的流对象有两个主要区别 Channel可以直接将指定文件的部分或全部直接映射成Buffer。

    1.1K10

    放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)

    但并不是所有的属性都可以被序列化和反序列化,基本上遵循一下规则: public修饰的属性可序列化和反序列化。 属性提供public的getter/setter方法,该属性可序列化和反序列化。...//反序列化时忽略json中存在但Java对象不存在的属性 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false...注解的使用 上面通过统一配置可对全局格式的序列化和反序列化进行配置,但某些个别的场景下,需要针对具体的字段进行配置,这就需要用注解。...@JsonProperty,作用JavaBean字段上,指定一个字段用于JSON映射,默认情况下映射的JSON字段与注解的字段名称相同。可通过value属性指定映射的JSON的字段名称。...反序列化时@JsonIgnoreProperties(ignoreUnknown=true)会忽略类中不存在的字段。 @JsonFormat作用于字段上,通常用来进行格式化操作。

    3.8K33

    面试被问Java序列化和反序列化为什么要实现Serializable接口

    当我们只在本地JVM里运行下Java实例, 这个时候是不需要什么序列化和反序列化的, 但当我们需要将内存中的对象持久化到磁盘, 数据库中时, 当我们需要与浏览器进行交互时, 当我们需要实现RPC时, 这个时候就需要序列化和反序列化了...前两个需要用到序列化和反序列化的场景, 是不是让我们有一个很大的疑问?...在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功...如果显示指定了serialVersionUID, JVM在序列化和反序列化时仍然都会生成一个serialVersionUID, 但值为我们显示指定的值, 这样在反序列化时新旧版本的serialVersionUID...如果我们的类写完后不再修改, 那当然不会有问题, 但这在实际开发中是不可能的, 我们的类会不断迭代, 一旦类被修改了, 那旧对象反序列化就会报错.

    1.1K20

    Android 序列化框架 Gson 原理分析,可以优化吗?

    API,在进行任何序列化或反序列化之前,我们都需要获得一个 Gson 对象。...,一个类中所有字段都会暴露,但使用 @Expose 注解后,只有声明注解的字段才会暴露; 注解的 serialize 变量或 deserialize 变量可以声明字段只参与序列化或反序列化,默认都参与。...每创建一种类型的 TypeAdapter,都需要递归地使用 “反射” 遍历所有字段,并解析字段上的注解,生成一个 的映射表。... 映射表 映射表 2、在序列化时,会写入枚举的 name。在反序列化时,会根据 name 查询枚举对象。...在 Gson 的反序列化中,首次反序列化一个类型的对象时,Gson 需要使用大量反射调用解析一个 TypeAdapter 适配器对象。随着 Model 的复杂程度增加,首次解析的耗时会不断膨胀。

    2.4K50

    剑指offer Java_工程图学基础知识点总结

    ConcurrentHashMap类中包含两个静态的内部类HashEntry和Segment.HashEntry用来封装映射表的键值对;Segment 用来充当锁的角色,每个 Segment对象守护整个散列映射表的若干个桶...因为在反序列化时,private修饰的属性也能查看到。...实现ExternalSerializable方法 自己对要序列化的内容进行控制,控制哪些属性被序列化,哪些不能被序列化; 8.1.2 实现反序列化 实现Serializable接口的对象在反序列化时不需要调用对象所在类的构造方法...,完全基于字节; 实现ExternalSerializable接口的方法在反序列化时会调用构造方法; 注意事项⚠️ 被static修饰的属性不能被序列化; 对象的类名、属性都会被序列化,方法不会被序列化...; 要保证序列化对象所在类的属性也是可以序列化的; 当通过网络、文件进行序列化时,必须按照写入的顺序读取对象; 反序列化时有序列化对象的class文件; 最好显式的声明serializableID,因为在不同的

    38620

    SpringDataJPA笔记(1)-基础概念和注解

    ; (4)默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。...如声明一个实体类 Customer,它将映射到数据库中的 customer 表上 @Table 当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用...entity class映射到一个或多个从表。从表根据主表的主键列(列名为referencedColumnName值的列),建立一个类型一样的主键列,列名由name属性定义。...,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响 @JsonIgnore 此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties...@JsonDeserialize 此注解用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize

    4K20

    用了几年的 Fastjson,我最终替换成了Jackson!

    例如下划线自动匹配驼峰等 Feature.DisableFieldSmartMatch 关闭 - - jackson可以通过ObjectMapper.setPropertyNamingStrategy()达到相同的目的,但这种是针对一个...关闭 - - jackson有一个类似的特性JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS可以将数字作为字符串输出,但没有覆盖所有非String类型 序列化时忽略会抛异常的...,等价于jackson的@JsonProperty.index() int ordinal() default 0; // 序列化和反序列化时的字段名称映射,等价于jackson的@JsonProperty.value...@JSONType 指定序列化和反序列化一个Java Bean时的行为。...> mappingTo() default Void.class; // 反序列化时指定java bean builder类(必须是@JSONPOJOBuilder注解的类),等价于jackson

    5.6K10

    springboot第42集:李佳琦说工作这么久了,还不懂Kafka吗?

    当你在 Java 中使用对象序列化(将对象转换为字节流以便存储或传输)时,每个序列化的类都会有一个 serialVersionUID。它的作用是在反序列化时确保类的版本匹配。...当你在 Java 中使用对象序列化(将对象转换为字节流以便存储或传输)时,每个序列化的类都会有一个 serialVersionUID。它的作用是在反序列化时确保类的版本匹配。...在反序列化时,Java 会使用被序列化数据中的 serialVersionUID 与类的当前版本的 serialVersionUID 进行比较。...通常,为了确保序列化和反序列化的兼容性,建议显式地定义 serialVersionUID,并在类的版本发生变化时手动更新它。...总之,serialVersionUID 是 Java 中用于控制序列化版本兼容性的机制,它确保了在类结构发生变化时反序列化操作的可靠性。 ObjectId 类看起来像是用于表示对象标识符的类。

    28520

    用了几年的 Fastjson,最终替换成了 Jackson!

    ,等价于jackson的@JsonProperty.index() int ordinal() default 0; // 序列化和反序列化时的字段名称映射,等价于jackson的@JsonProperty.value...@JSONType 指定序列化和反序列化一个 Java Bean 时的行为。...> mappingTo() default Void.class; // 反序列化时指定java bean builder类(必须是@JSONPOJOBuilder注解的类),等价于jackson...typeName() default ""; // 反序列化某个接口或抽象类或父类的子类时指定根据哪个字段的值和子类的typeName相等来决定具体实现类,等价于jackson的@JsonTypeInfo.use...() = Id.CUSTOM + @JsonTypeInfo.property() String typeKey() default ""; // 反序列化某个接口或抽象类或父类的子类时指定可以反序列化的子类类型

    2.3K30
    领券