readObject方法实际上相当于另一个公有的构造器,与其他构造器一样,它也需要进行参数的有效性检查与保护性拷贝。参考:Effective Java之必要时进行保护性拷贝(三十九)

原因很简单,为了避免客户端修改可变对象,服务器把可变对象的引用指向了客户端找不到的地方,但是默认反序列化的过程把客户端找不到的地方给了客户端,给了客户端修改的机会,导致了错误,readObject也应该完成构造器做的事。

private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
// Defensively copy our mutable components
start = new Date(start.getTime());
end = new Date(end.getTime());
// Check that our invariants are satisfied
if (start.compareTo(end) > 0)
throw new InvalidObjectException(start +" after "+ end);
}
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {s.defaultReadObject();start = new Date(start.getTime());end = new Date(end.getTime());if (start.compareTo(end) > 0)throw new InvalidObjectException(start +" after "+ end);
}

Effective Java之保护性编写readObject方法(七十六)相关推荐

  1. Effective Java之避免使用终结方法(七)

    1.终结方法的缺点 1.终结方法不能保证及时执行,因此注重时间的任务不应该由终结方法来完成.例如:用终结方法去关闭已经打开的文件,这是一种严重错误,因为打开文件描述符是一种很有限的资源,如果jvm延迟 ...

  2. Effective Java之谨慎地实现Serializable(七十四)

    1.序列化的含义和作用 序列化用来将对象编码成字节流,反序列化就使将字节流编码重新构建对象. 序列化实现了对象传输和对象持久化,所以它能够为远程通信提供对象表示法,为JavaBean组件提供持久化数据 ...

  3. Effective Java之坚持使用Overide注解(三十六)

    @Override 注解: 表示被注解的方法声明覆盖了超类型中的一个声明 1.我们应该在想要覆盖超类声明的每个方法声明中使用 Override 注解 ; 如果使用了Override注解的方法是重载而不 ...

  4. 第七十六章 方法关键字 - SoapAction

    文章目录 第七十六章 方法关键字 - SoapAction 用法 详情 默认 WSDL的关系 对消息的影响 第七十六章 方法关键字 - SoapAction 指定当通过HTTP将此方法作为web方法调 ...

  5. 七十六、Python | Leetcode二分查找和分治算法系列

    @Author:Runsen @Date:2020/7/4 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  6. (七十六):Masked Autoencoders Are Scalable Vision Learners

    (七十六):Masked Autoencoders Are Scalable Vision Learners Abstract 1. Introduction 2. Related Work 3. M ...

  7. 第七十六章 SQL命令 TOP

    文章目录 第七十六章 SQL命令 TOP 大纲 参数 描述 TOP int值 TOP和缓存查询 TOP和ORDER BY TOP 优化 TOP与聚合和函数 示例 第七十六章 SQL命令 TOP 指定返 ...

  8. JavaScript学习(七十六)—this的指向问题

    JavaScript学习(七十六)-this的指向问题 在文档中(全局环境中)直接使用this,代表的是window 在HTML事件处理程序中,如果将this作为实参传递给事件处理函数,this代表的 ...

  9. 今有兽,六首四足;禽,四首二足,上有七十六首,下有四十六足。问:禽、兽各几何?...

    根据题目描述,兽有六首四足,禽有四首二足,上面有七十六首,下面有四十六足.根据题意,兽和禽的数量可以用首数和足数来确定. 首数为76,足数为46,先用首数来算: 76首/6首=12.67个,可知兽有1 ...

最新文章

  1. 英文版PDF不能显示中文PDF文件的解决方法
  2. XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较
  3. 还是畅通工程(克鲁斯卡尔算法+并查集)
  4. Redis的8大数据类型,写的真好
  5. [No0000197]Windows用户都应该知道的运行命令
  6. Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息
  7. 欧姆龙cp1h指令讲解_欧姆龙cp1h常用指令学习(六)功能块、子程序
  8. 每月物品消耗统计表_预算统计表- .doc
  9. Windows实现微信多开
  10. bat脚本学习——拖拽文件到bat下载
  11. 狂神Redis学习笔记(已更完)
  12. VML实例-拖动效果
  13. iOS Charts
  14. 类选择器和ID选择器
  15. Python绘图实例3:正八边形绘制
  16. 自己的智能AI聊天机器人,可自定义头像,免费html源码分享,粘贴即用!
  17. 编程题:核桃的数量(求最小公倍数的问题)
  18. 计算机课遇到游戏,信息技术课玩游戏的现象及想法
  19. C++ 关于日期时间(四)asctime/ctime/gmtime/time_t/tm
  20. spring源码学习之整合Mybatis原理分析

热门文章

  1. INLINE HOOK过驱动保护的理论知识和大概思路
  2. 他35岁,年薪100万,牛逼的人生无需解释
  3. 什么是真正的架构设计?
  4. Android Databinding学习
  5. OS--进程间通信详解(二)
  6. 三十年TCP与七年QUIC 谁才是未来?
  7. 音视频技术开发周刊 93期
  8. 编码服务正在步入云端
  9. C/C++学习之路_九:文件操作
  10. 如何存储 Git 大文件?