当前位置: 首页 > news >正文

东莞樟木头网站建设长沙网站制作主要公司

东莞樟木头网站建设,长沙网站制作主要公司,如何建立网站的英文版,网站怎样添加友情链接文章目录 序列化是什么?常见的序列化协议使用序列化反序列化序列化List反序列化List 查看源码,分析不足进行改善 序列化是什么? 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象&#xff0c…

文章目录

  • 序列化是什么?
  • 常见的序列化协议
  • 使用
    • 序列化
    • 反序列化
    • 序列化List
    • 反序列化List
  • 查看源码,分析不足
  • 进行改善

序列化是什么?

如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。

  • 序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式
  • 反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程

对于 Java 这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class)

下面是序列化和反序列化常见应用场景:

  • 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  • 将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
  • 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
  • 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。

序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。

常见的序列化协议

JDK 自带的序列化方式一般不会用 ,因为序列化效率低并且存在安全问题。比较常用的序列化协议有 fastjson、jackson、protobuf(PB)、、、
在我的项目中,使用jackson

使用

我们所有的jackson序列化以及反序列化都是基于ObjecMapper来操作的
我们先定义一个错误的异常类。后续所有的序列化反序列化操作都是针对这个错误类实例出的对象而完成的。

@Data
public class CommonResult<T> implements Serializable {private Integer code;private T data;private String msg;public static <T> CommonResult<T> success(T data) {CommonResult<T> result = new CommonResult<T>();result.code = GlobalErrorCodeConstants.SUCCESS.getCode();result.data = data;result.msg = "";return result;}public static <T> CommonResult<T> error(Integer code, String msg) {Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code),"code 不是错误的异常");CommonResult<T> result = new CommonResult<T>();result.code = code;result.msg = msg;return result;}public static <T> CommonResult<T> error(ErrorCode errorCode){return error(errorCode.getCode(), errorCode.getMsg());}
}

序列化

 void TestJackson(){ObjectMapper objectMapper = new ObjectMapper();CommonResult<String> commonResult1 =  CommonResult.error(500,"系统错误!");//序列化String str;try {str = objectMapper.writeValueAsString(commonResult1);System.out.println(str);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}

反序列化

 //反序列化try {CommonResult<String> commonResult = objectMapper.readValue(str, CommonResult.class);System.out.println(commonResult.getCode()+commonResult.getMsg());} catch (JsonProcessingException e) {throw new RuntimeException(e);}

序列化List

//序列化listList<CommonResult<String>> list = Arrays.asList(CommonResult.success("success111"),CommonResult.success("success222"));try {str = objectMapper.writeValueAsString(list);System.out.println(str);} catch (JsonProcessingException e) {throw new RuntimeException(e);}

反序列化List

这里反序列化有一个注意事项
在这里插入图片描述
objecMapper.readValue里面的第二个参数 valueType不能直接放里不能直接放 list<CommonResult<String>>.class,要使用 JavaType的方法 将list 和 list里面的元素 整合成一个类型

 //反序列化listJavaType listType = objectMapper.getTypeFactory().constructParametricType(List.class,CommonResult.class);try {list = objectMapper.readValue(str,listType);System.out.println(list);} catch (JsonProcessingException e) {throw new RuntimeException(e);}

运行结果如下
在这里插入图片描述

查看源码,分析不足

在我上述给出的代码中,我们可以看到,每一次进行序列化反序列化操作时,都需要进行try-catch操作,那么我们观察springboot的源码,可以来借鉴改善我们的代码

点开SpringBoot源码,找到反序列化List的方法。

  public List<Object> parseList(String json) {return (List)this.tryParse(() -> {return (List)this.getObjectMapper().readValue(json, LIST_TYPE);}, Exception.class);}

我们观察到,里面调用到了tryParse这个方法,我们点开这个方法

 protected final <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) {try {return parser.call();} catch (Exception var4) {Exception ex = var4;if (check.isAssignableFrom(ex.getClass())) {throw new JsonParseException(ex);} else {ReflectionUtils.rethrowRuntimeException(ex);throw new IllegalStateException(ex);}}}

我们可以看到parseList中通过lambda表达式的方式,将异常全部在tryParse中进行try-catch。

解析tryParse

  1. 参数列表
    Callable<T> parser, Class<? extends Exception> check
    第一个参数是一个Callable,第二个参数是一个Exception的class
  2. 返回值
    泛型T
  3. parser.call()
    相当于是将parseList中的lambda表达式进行调用。(List)this.tryParse(() -> { return (List)this.getObjectMapper().readValue(json, LIST_TYPE);
  4. catch (Exception var4) { Exception ex = var4; if (check.isAssignableFrom(ex.getClass())) { throw new JsonParseException(ex); }
    检查捕获的这个var4异常是否是我们传入的check异常的实例或者是其子类的一个实例,如果是,就抛出JsonParseException(ex)

5.else { ReflectionUtils.rethrowRuntimeException(ex); throw new IllegalStateException(ex); }
不是预期的异常,就抛出IllegalStateException(ex)

进行改善

  1. 对ObjecMappper使用一个单例的构造方法
  2. 使用tryParse来对try-catch进行优化
public class JacksonUtil {public JacksonUtil() {}//单例模式 创建objecMapperprivate final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER = new ObjectMapper();}private static ObjectMapper getObjectMapper() {return OBJECT_MAPPER;}// 以后就可以直接调用这个方法 而不用再传一个异常private static <T> T tryParse(Callable<T> parser) {return tryParse(parser, JacksonException.class);}/*/参考的是 springboot源码  */private static <T> T tryParse(Callable<T> parser,Class<? extends Exception> check) {try {return parser.call();} catch (Exception ex) {if (check.isAssignableFrom(ex.getClass())) {throw new JsonParseException(ex);}throw new IllegalStateException(ex);}}/*** 序列化方法* @param object* @return*/public static String writeValueAsString(Object object){return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().writeValueAsString(object);});}/*** 反序列化* @param content* @param valueType* @return* @param <T>*/public static<T> T readValue(String content, Class<T> valueType) {return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(content, valueType);});}/*** 反序列化list* @param content* @param paramClasses* @return* @param <T>*/public static <T> T readListValue(String content, Class<?> paramClasses) {JavaType javaType = JacksonUtil.getObjectMapper().getTypeFactory().constructParametricType(List.class, paramClasses);return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(content, javaType);});}}
http://www.hkea.cn/news/413483/

相关文章:

  • 做静态网站选用什么服务器站长素材网站
  • 网站建设先做前台还是后台百度认证是什么
  • 广州专业做crm系统的供应商seo网站培训班
  • 景安建网站企业网站seo方案案例
  • 山东滕州疫情最新消息今天i长沙官网seo
  • 公司做网站买域名之后做什么百度一下你就知道手机版
  • 北京婚恋网站哪家最好企业推广宣传方式
  • 国发网站建设西安做网站公司
  • 网站推广服务合同简述网络营销的主要方法
  • 信息门户网站是什么成人计算机培训机构哪个最好
  • 网站建设公司 中企动力公司东莞商城网站建设
  • b2c的电子商务网站自己想做个网站怎么做
  • 京东pc网站用什么做的如何注册网站怎么注册
  • 长沙商城网站制作seo线下培训课程
  • web网站开发公司网站制作优化排名
  • 这么做3d网站企业邮箱网页版
  • 瑞安网站建设公司关键词排名网络推广
  • 南京学做网站友情链接检查工具
  • 参考文献网站开发百度重庆营销中心
  • 如何做微信ppt模板下载网站企业网页设计公司
  • 做b2b网站百度点击快速排名
  • 网站怎么做移动图片不显示不出来吗芭嘞seo
  • 旅游网站建设服务器ip域名解析
  • 企业网站建设三个原则百度指数资讯指数是指什么
  • 房地产集团网站建设方案软文文案案例
  • 阜蒙县建设学校网站是什么北京seo编辑
  • 珠海建设局网站十大经典事件营销案例分析
  • 创建网站开发公司互联网推广引流是做什么的
  • 万盛集团网站建设seo网站推广全程实例
  • 做教育的网站需要资质吗网站怎么开发