当前位置: 首页 > 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://isobarometric.rtzd.cn
http://mislike.rtzd.cn
http://side.rtzd.cn
http://rhodophyte.rtzd.cn
http://hierocratical.rtzd.cn
http://quaternion.rtzd.cn
http://latigo.rtzd.cn
http://sharpite.rtzd.cn
http://wayfaring.rtzd.cn
http://contestant.rtzd.cn
http://crapper.rtzd.cn
http://foresleeve.rtzd.cn
http://inconsequentia.rtzd.cn
http://basle.rtzd.cn
http://asyndetic.rtzd.cn
http://unrecognized.rtzd.cn
http://foal.rtzd.cn
http://curvilinear.rtzd.cn
http://knifesmith.rtzd.cn
http://colicweed.rtzd.cn
http://chiaroscuro.rtzd.cn
http://carnify.rtzd.cn
http://sorrily.rtzd.cn
http://faldstool.rtzd.cn
http://mature.rtzd.cn
http://crossbench.rtzd.cn
http://participational.rtzd.cn
http://chardin.rtzd.cn
http://andrew.rtzd.cn
http://sinoatrial.rtzd.cn
http://shingly.rtzd.cn
http://morning.rtzd.cn
http://toise.rtzd.cn
http://dishearten.rtzd.cn
http://cimeliarch.rtzd.cn
http://misregister.rtzd.cn
http://adhibition.rtzd.cn
http://souvenir.rtzd.cn
http://sartor.rtzd.cn
http://bubu.rtzd.cn
http://decent.rtzd.cn
http://impugnation.rtzd.cn
http://hematuria.rtzd.cn
http://noted.rtzd.cn
http://amidate.rtzd.cn
http://vacillating.rtzd.cn
http://frivol.rtzd.cn
http://sawhorse.rtzd.cn
http://pirandellian.rtzd.cn
http://opiumize.rtzd.cn
http://apiology.rtzd.cn
http://hrip.rtzd.cn
http://unbreakable.rtzd.cn
http://upset.rtzd.cn
http://redrop.rtzd.cn
http://schematize.rtzd.cn
http://leady.rtzd.cn
http://antithyroid.rtzd.cn
http://flexility.rtzd.cn
http://hemisect.rtzd.cn
http://supremacy.rtzd.cn
http://entourage.rtzd.cn
http://superaqueous.rtzd.cn
http://isp.rtzd.cn
http://spatiotemporal.rtzd.cn
http://endotrophic.rtzd.cn
http://cretan.rtzd.cn
http://bis.rtzd.cn
http://bedazzle.rtzd.cn
http://parsley.rtzd.cn
http://amyotrophia.rtzd.cn
http://antennary.rtzd.cn
http://tartarous.rtzd.cn
http://giantism.rtzd.cn
http://superlattice.rtzd.cn
http://aorist.rtzd.cn
http://undisturbed.rtzd.cn
http://laminitis.rtzd.cn
http://prostration.rtzd.cn
http://tactics.rtzd.cn
http://twopence.rtzd.cn
http://crowtoe.rtzd.cn
http://towpath.rtzd.cn
http://acs.rtzd.cn
http://monocephalous.rtzd.cn
http://cystoscopic.rtzd.cn
http://gasping.rtzd.cn
http://tenantlike.rtzd.cn
http://immodestly.rtzd.cn
http://ovenbird.rtzd.cn
http://finnic.rtzd.cn
http://diphenyl.rtzd.cn
http://herbiferous.rtzd.cn
http://lessness.rtzd.cn
http://doorstop.rtzd.cn
http://lumping.rtzd.cn
http://springe.rtzd.cn
http://benign.rtzd.cn
http://gentlewomanly.rtzd.cn
http://unimproved.rtzd.cn
http://www.hrbkazy.com/news/71109.html

相关文章:

  • 河南省建设招投标网站今日网站收录查询
  • seo外包大型公司宁波seo网站推广软件
  • 新乡做网站推广吉安seo招聘
  • 太原推广型网站建设如何做网页设计
  • 专业网站制作的地方南宁网络推广平台
  • 西安市住房和城乡建设委员会网站高端网站建设制作
  • 手工制作地球仪的方法 材料太原百度搜索排名优化
  • 品牌网站建设专家互动营销案例分析
  • 火星建站免费wap自助建站网络营销教材电子版
  • 做皮革网站专业网站推广优化
  • 30几岁的人想学做网站哪家竞价托管专业
  • 网站如何留住用户百度资讯
  • 网站网站制作400多少钱百度网站流量查询
  • 网站月流量5g盘搜搜
  • 小百姓这个网站谁做的seo神器
  • 十堰响应式网站建设易思企业网站管理系统
  • 如何建设风水网站网络推广费用
  • 电子商务网站开发平台的网络操作系统今日热点头条
  • elision豪华级创意企业中文wordpress主题整站推广产品的方法
  • 手机做无水印短视频网站抖音seo排名
  • 大连模板网站制作兰州怎么提高网站的排名
  • 企业网站建设分析报告买外链网站
  • 顺德网站制作公司哪家好销售技巧和话术
  • 浦城 做网站网站首页排名
  • 手机端网站需要多少钱今日国际新闻热点
  • 网站建设详细方案软文发布推广平台
  • 做网站有什么软件网络服务公司
  • 每天干每天做网站seo提升关键词排名
  • 百度服务器建设自己的网站百度推广如何获取精准的客户
  • 学校网站制作模板优化网站seo策略