序列化禁止使用Optional
序列化 禁止 optional 使用
2023-09-11 14:17:19 时间
1: 概论
Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法
2: 例子:
很多博文一上来就给力以下使用例子
1 @Data 2 public class User { 3 private String name; 4 private Integer age; 5 private Optional<Address> address = Optional.empty(); 6 } 1 @Data 2 public class Address { 3 private Optional<Street> street = Optional.empty(); 4 } 1 @Data 2 public class Street { 3 private String streetName; 4 private Integer streetNo; 5 }
然后使用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
相关文章
- 序列化的概念以及分类
- Unity插件开发基础—浅谈序列化系统
- netty系列之:使用Jboss Marshalling来序列化java对象
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
- Serialzable和Parcelable的区别?Bunder传递对象为什么需要序列化?
- C# Newtonsoft.Json JsonSerializerSettings 全局序列化设置
- Java序列化Serializable
- 26 MAPREDUCE中的序列化
- 微信小程序 - 根据后端返回的唯一 ID / code,生成 “唯一“ 的推荐码、邀请码、订单号、加密路由、一串英文+数字长字符等 (支持反序列化原 ID 解码,逆向得出 ID 二者互转)wechat
- 《Spark大数据分析:核心概念、技术及实践》一1.2 数据序列化
- [.NET]使用十年股价对比各种序列化技术
- 注解实现json序列化的时候自动进行数据脱敏
- Java对象序列化给分布式计算带来的方便
- Java序列化的几种方式以及序列化的作用
- Java 的序列化 (Serialization) 教程
- 一、.Net Core 3.1 全局序列化
- 对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
- Java IO篇:序列化与反序列化
- 漏洞复现 - - - WebLogic反序列化远程命令执行漏洞(二)
- Unity 中XML序列化和反序列化
- JAVA序列化/反序列化与单例
- Java序列化机制中的类版本号问题