序列化与反序列化

场景:项目中,将对象序列化,base64编码,存入到redis缓存中。使用时在反序列化取出来。
问题:对象增加新的基本类型属性long类型。对于使用没有该属性的对象序列化的结果能否被反序列化初始这个属性。

基本类型

1、序列初始化时,将手机发送时间sendTime相关属性以及下文测试方法的步骤2注释掉。
2、运行测试样例,生成sms.txt文件。
3、取消注释,将测试方法的步骤1注释掉。
4、运行测试样例,看控制台打印信息。

package study.java.Serializable;

import java.io.Serializable;

public class MessageValue implements Serializable {

    private static final long serialVersionUID = -4387708091987654321L;
    // 手机短信验证码
    private String code;

    // 手机短信发送时间
    private long sendTime;

    //验证次数
    private int validateCount;

    public MessageValue(){

    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public long getSendTime() {
        return sendTime;
    }

    public void setSendTime(long sendTime) {
        this.sendTime = sendTime;
    }


    public int getValidateCount() {
        return validateCount;
    }

    public void setValidateCount(int validateCount) {
        this.validateCount = validateCount;
    }

}

package study.java.Serializable;

import java.io.*;

public class SerializableTest  {
    public static void main(String[] args) throws Exception {
       //步骤1
        serializeMessageValue();
        //步骤2
        MessageValue messageValue = deserializeMessageValue();
        StringBuilder sb = new StringBuilder();
        System.out.println(messageValue.getLastSendTime());

    }

    /**
     * 序列化
     */
    private static void serializeMessageValue() throws IOException {
        MessageValue messageValue=new MessageValue();
        messageValue.setCode("123456");
        messageValue.setValidateCount(1);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/sms.txt")));
        oos.writeObject(messageValue);
        System.out.println("对象序列化成功!");
        oos.close();
    }

    /**
     * 反序列化
     */
    private static MessageValue deserializeMessageValue() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/sms.txt")));
        MessageValue mess = (MessageValue) ois.readObject();
        System.out.println("对象反序列化成功!");
        return mess;
    }
}

结论

打印初始对象long为0。证明可以得到该属性,并且该属性被初始为0,不会产生异常。

注:自己设置一个 serialVersionUID,否则jvm自动分配,报非法异常。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化de...
    步积阅读 1,513评论 0 10
  • 引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在...
    xdoyf阅读 595评论 0 0
  • 公众号:追风栈Binary 我们通过文本或者数据库的方式来永久化存储程序中产生的数据。这种思路也可以借鉴到保存Ja...
    windytouch阅读 571评论 0 1
  • 在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些...
    懒癌正患者阅读 1,704评论 0 12
  • .rx的实现原理关联类型。主要实现ReactiveCompatible协议,实现了这个协议的都会有rx。万物皆rx
    忆痕无殇阅读 907评论 0 1

友情链接更多精彩内容