序列化禁止使用Optional
1: 概论
Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法
2: 例子:
很多博文一上来就给力以下使用例子
@Data
public class User {
private String name;
private Integer age;
private Optional<Address> address = Optional.empty();
} @Data
public class Address {
private Optional<Street> street = Optional.empty();
} @Data
public class Street {
private String streetName;
private Integer streetNo;
}
然后使用Optional 进行链式调用
1 public String getUserSteetName(User user) {
2
3 Optional<User> userOptional = Optional.ofNullable(user);
4 final String streetName = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetName();
5 return StringUtils.isEmpty(streetName) ? "nothing found" : streetName;
6 }
下面我们对这个类进行序列化与反序列化:
ByteArrayOutputStream bos = new ByteArrayOutputStream();//序列化常规代码
ObjectOutputStream obr = new ObjectOutputStream(bos);
obr.writeObject(user); ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream inputStream2 = new ObjectInputStream(inputStream);
User user = (Address) inputStream2.readObject();
System.out.println(address2.getStreet().get().getStreetName());
抛出: Exception in thread "main" java.io.NotSerializableException: java.util.Optional 异常, 说明我们不能这样用,Optional 不支持Optional
并且也没有实现相关的序列化接口
public final class Optional<T> {
/**
* Common instance for {@code empty()}.
3:总结
这说明了一个问题:
- Java 8 提供大Optional 并不能支持序列化
- 解决NPE,可以考虑在具体的业务逻辑中 使用Optional类提供相关的解决办法 比如Optional.of() 方法
- Optional一方面的出现,主要还是配合Stream流,比如 reduce() findAny() findFirst()方法提供了返回Optional的操作接口
在实体类 千万不能使用Optional处理NPE,具体的处理逻辑在业务中处理,并且最好完整定义JOPO,不能嵌入无关逻辑,
另一篇文章 : https://www.cnblogs.com/dgwblog/p/11759665.html
序列化禁止使用Optional的更多相关文章
- Protobuf在Python中的应用(序列化数据)
1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...
- Protobuf的简单介绍、使用和分析
Protobuf的简单介绍.使用和分析 一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...
- Java 8 新特性:6-Optional类
(原) 先看看上面的说明: /** * A container object which may or may not contain a non-null value. * If a value i ...
- Thrift学习笔记—IDL基本类型
thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,并通过生成不同的语言代理实现来达到跨语言.平台的功能.在thrift的IDL中可以定义以下一 ...
- IDL语言开发规范
一.支持的类型 1.IDL支持常见的基本类型,常量,枚举,容器,结构体,服务.不支持多态和重载,参数.返回值不能为空,各个基本类型的标识如下: bool:对应java的boolean,布尔类型(tru ...
- 【传输协议】thrift的IDL语法
一.IDL Thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编写的代码,通过这 ...
- Thrift IDL基本语法
简言:介绍Thrift的IDL基本语法,初次使用或多或少的会有很有"坑"要踩,但是我们要遇山挖山,遇海填海,在学习的道路上坚定的走下去,方可日后吹牛B! IDL Thrift 采用 ...
- jackson学习之五:JsonInclude注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- thrift的介绍及其使用
什么是thrift Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式:用户通过Thrift的IDL(接口定义语言)来描述接口函数及数 ...
随机推荐
- 【cf960G】G. Bandit Blues(第一类斯特林数)
传送门 题意: 现在有一个人分别从\(1,n\)两点出发,包中有一个物品价值一开始为\(0\),每遇到一个价值比包中物品高的就交换两个物品. 现在已知这个人从左边出发交换了\(a\)次,从右边出发交换 ...
- java.lang.IllegalStateException: Cannot call sendError() after the response has been committe
1.问题描述 严重: Servlet.service() for servlet [default] in contextwith path [/OxygenCloud] threw exceptio ...
- 剑指Offer-39.把数组排成最小的数(C++/Java)
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...
- 【开发工具】本机安装的JDK8,启动IDEA2019没反应
问题描述 本来开发工具安装的是IDEA2018,有天用着用着突然崩溃了,重启后死活用不了.心血来潮下载了2019版本,顺利安装完,但是点击快捷方式启动的时候一直没反应.后来咨询同事,在下面的启动脚本中 ...
- three.js实现土星绕太阳体系
概况如下: 1.SphereGeometry实现自转的太阳,土星: 2.RingGeometry实现土星公转轨道: 3.ImageUtils加载球体贴图: 4.canvas中createRadialG ...
- SpringCloud的入门学习之概念理解、Hystrix断路器
1.分布式系统面临的问题,复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 2.什么是服务雪崩? 答:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务 ...
- C/C++ 中 `printf` 格式化
作为强类型静态语言,类型不仅规定了可以对数据进行的操作,还决定了应该怎样在 printf 中输出. printf 的签名是: int printf ( const char * format, ... ...
- JQuery iframe宽高度自适应浏览器窗口大小的解决方法
iframe宽高度自适应浏览器窗口大小的解决方法 by:授客 QQ:1033553122 1. 测试环境 JQuery-3.2.1.min.js 下载地址: https://gitee.com ...
- Cesium专栏-空间分析之剖面分析(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- 编译原理之不懂就问-First集
老师PPT: 这条语言实在是..通俗易懂