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

专业的广州微网站建设网络营销案例介绍

专业的广州微网站建设,网络营销案例介绍,网站降权不更新文章可以吗,江安网站建设一、认识序列化和反序列化 Serialization#xff08;序列化#xff09;是一种将对象以一连串的字节描述的过程#xff1b;deserialization#xff08;反序列化#xff09;是一种将这些字节重建成一个对象的过程。将程序中的对象#xff0c;放入文件中保存就是序列化…一、认识序列化和反序列化 Serialization序列化是一种将对象以一连串的字节描述的过程deserialization反序列化是一种将这些字节重建成一个对象的过程。将程序中的对象放入文件中保存就是序列化将文件中的字节码重新转成对象就是反序列化。 二、为什么要实现序列化和反序列化 我们创建的 Java 对象被存储在 Java 堆中当程序运行结束后这些对象会被 JVM 回收。但在现实的应用中可能会要求在程序运行结束之后还能读取这些对象并在以后检索数据这时就需要用到序列化。当两个进程进行远程通信时可以相互发送各种类型的数据包括文本、图片、音频、视频等 而这些数据都会以二进制序列的形式在网络上传送。而 java 是面向对象的开发方式一切都是 java 对象想要实现 java 对象的网络传输就可以使用序列化和反序列化来实现。发送方将需要发送的 Java 对象序列化转换为字节序列然后在网络上传送接收方接收到字符序列后使用反序列化从字节序列中恢复出 Java 对象。 总结在网络中数据的传输必须是序列化形式来进行的。 三、序列化和反序列化的实现 1、JDK 类库提供的序列化 API java.io.ObjectOutputStream表示对象输出流 它的 writeObject(Object obj) 方法可以对参数指定的 obj 对象进行序列化把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream表示对象输入流 它的 readObject() 方法从源输入流中读取字节序列再把它们反序列化成为一个对象并将其返回。 2、实现序列化的要求 只有实现了 Serializable 或 Externalizable 接口的类的对象才能被序列化否则抛出异常。 public class SerializableTest {public static void main(String[] args) throws IOException, ClassNotFoundException {serializeStudent();deserializeStudent();}// JDK 类库中序列化的步骤static void serializeStudent() throws IOException, ClassNotFoundException {// 创建一个对象输出流它可以包装一个其他类型的目标输出流如文件输出流FileOutputStream fos new FileOutputStream(F:\\HaC.txt);ObjectOutputStream oos new ObjectOutputStream(fos);Student student1 new Student(HaC, HelloCoder, 30);// 通过对象输出流的 writeObject() 方法写对象oos.writeObject(student1);oos.flush();System.out.println(Student 对象序列化成功);oos.close();}// JDK 类库中反序列化的步骤static void deserializeStudent() throws IOException, ClassNotFoundException {// 创建一个对象输入流它可以包装一个其它类型输入流如文件输入流FileInputStream fis new FileInputStream(F:\\HaC.txt);ObjectInputStream ois new ObjectInputStream(fis);// 通过对象输出流的 readObject() 方法读取对象Student student2 (Student) ois.readObject();System.out.println(student2.getUserName() student2.getPassword() student2.getYear());System.out.println(Student 对象反序列化成功);} }Data AllArgsConstructor class Student implements Serializable {private static final long serialVersionUID 3608451818006447637L;private String userName;private String password;private String year; } 可以看到生成了一个打开是乱码的二进制文件 其实这个例子就是序列化和反序列化的一个小过程JVM 通过序列化把对象写到文件再通过反序列化从文件中读取数据把数据转成一个对象。 看到控制台输出也是正常的 Student 对象序列化成功 HaC HelloCoder 30 Student 对象反序列化成功 四、serialVersionUID 的作用 虚拟机是否允许反序列化不仅取决于类路径和功能代码是否一致一个非常重要的一点是两个类的序列化 ID 是否一致这个所谓的序列化 ID就是我们在代码中定义的 serialVersionUID。 serialVersionUID 得生成方法 private static final long serialVersionUID 1L;根据包名类名继承关系非私有的方法和属性以及参数返回值等诸多因子计算得出的极度复杂生成的一个 64 位的哈希字段。基本上计算出来的这个值是唯一的。比如private static final long serialVersionUID xxxxL。显示声明 serialVersionUID 可以避免对象不一致如果没有显示的定义 serialVersionUID 变量的时候JAVA 序列化机制会根据 Class 自动生成一个 serialVersionUID 作序列化版本比较用这种情况下如果 Class 文件 (类名方法名等) 没有发生变化(增加空格换行增加注释等等)就算再编译多次serialVersionUID 也不会变化的。 五、SpringBoot 中的序列化和反序列化 在项目开发中我们的类并没有实现 Serializable 接口实际上这是 Spring 框架帮我们做了一些事情Spring 并不是直接把 User 对象进行网络传输而是把 User 对象转换成 json 格式的字符串然后再进行传输的而 String 类实现了 Serializable 接口并且显示指定了 serializableUID public final class Stringimplements java.io.Serializable, ComparableString, CharSequence {private final char value[];private int hash; // Default to 0private static final long serialVersionUID -6849794470754667710L;Json 是一种轻量级的文本数据交换格式在 Json 字符串中 {} 用来表示对象[ ] 用来表示列表数据以 key:value 的形式存放如 {name:zhangsan,age:22,course:[java,python] } 在 SpringBoot 中想要一个接口接收 Json 格式的数据并返回 Json 格式的数据前端将 http 请求头 “Accept” 设置为 “application/json”,Content-Type 为 application/json 中间件只需要在 Controller 类中做如下定义 RestController RequestMapping(/equity) public class EquityExpose {PostMapping(/list)ApiOperation(value 权益列表, notes 权益列表)public ApiResultResponseGetEquityResponse list(RequestBody GetEquityRequest request) {return service.list(request);}} 在 Controller 中使用 ResponseBody 注解即可返回 Json 格式的数据而 RestController 注解包含了 ResponseBody 注解所以默认情况下RestController 即可将返回的数据结构转换成 Json 格式。 这些注解之所以可以进行 Json 与 JavaBean 之间的相互转换就是因为 HttpMessageConverter 发挥着作用。 org.springframework.http.converter.HttpMessageConverter 是一个策略接口是 Http request 请求和 response 响应的转换器该接口只有五个方法它的 canRead() 方法返回 true然后它的 read() 方法会从请求中读出请求参数绑定到 readString() 方法的 string 变量中。 当 SpringMVC 执行 readString 方法后由于返回值标识了 ResponseBodySpringMVC 将使用 StringHttpMessageConverter 的 write() 方法将结果作为 String 值写入响应报文当然此时 canWrite() 方法返回 true。 public interface HttpMessageConverterT {//判断当前转换器是否可以解析前端传来的数据boolean canRead(Class? clazz, MediaType mediaType);//判断当前转换器是否可以将后端数据解析为前端需要的格式boolean canWrite(Class? clazz, MediaType mediaType);//获取当前转换器可以解析的数据类型ListMediaType getSupportedMediaTypes();//读取前端传来的数据T read(Class? extends T clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException;//将后台数据转换返回给前端void write(T t, MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException;} 流程图如下 前端发来请求后先调用 HttpInputMessage 从输入流中获取 Json 字符串然后在 HttpMessageConverter 中把 Json 转换为接口需要的形参类型。 六、定制化 当出现特定的需求时比如此时需要自定义自己的消息转换器可以使用 Spring 或者第三方提供的 HttpMessageConverter 如FastJsonGson Jackson 问题引入字符类型字段为 null 时输出为 “”而不是 null 1、引入依赖 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.70/version /dependency 2、对 FastJsonHttpMessageConverter 进行配置 Configuration public class MyWebmvcConfiguration implements WebMvcConfigurer {Overridepublic void extendMessageConverters(ListHttpMessageConverter? converters) {FastJsonHttpMessageConverter fjc new FastJsonHttpMessageConverter();FastJsonConfig fj new FastJsonConfig();//字符类型字段如果为null则输出,而非nullfj.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);fjc.setFastJsonConfig(fj);// 将该自定义转换器排在第一个使其生效converters.add(0, fjc);} }3、SerializerFeature 配置属性的解释 属性名称解释QuoteFieldNames输出key时是否使用双引号,默认为trueUseSingleQuotes使用单引号而不是双引号,默认为falseWriteMapNullValue是否输出值为null的字段,默认为false。应用场景前端必须需要所有字段UseISO8601DateFormatDate使用ISO8601格式输出默认为falseWriteNullListAsEmptyList字段如果为null,输出为[],而不是nullWriteNullStringAsEmpty字符类型字段如果为null,输出为,而不是nullWriteNullNumberAsZero数值字段如果为null,输出为0,而非nullWriteNullBooleanAsFalseBoolean字段如果为null,输出为false,而非nullSkipTransientField如果是true类中的Get方法对应的Field是transient序列化时将会被忽略。默认为trueSortField按字段名称排序后输出。默认为false 配置前如果字符串类型为 null 的话输出是为 null {id: 11,name: null } 配置后如果字符串类型为 null 的话输出是为 {id: 11,name: null } 七、序列化及反序列化相关知识 在Java中只要一个类实现了 java.io.Serializable 接口那么它就可以被序列化。通过 ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化。虚拟机是否允许反序列化不仅取决于类路径和功能代码是否一致一个非常重要的一点是两个类的序列化 ID 是否一致就是 private static final long serialVersionUID 。序列化并不保存静态变量。要想将父类对象也序列化就需要让父类也实现 Serializable 接口。Transient 关键字的作用是控制变量的序列化在变量声明前加上该关键字可以阻止该变量被序列化到文件中在被反序列化后transient 变量的值被设为初始值如 int 型的是 0对象型的是 null。 八、过程中遇到的问题及解决办法 1、FastJsonHttpMessageConverter 不生效没有注入到 Spring 容器中 原因项目中同时存在了 WebMvcConfigurationSupport 和 WebMvcConfigurer 这两个配置只有该 WebMvcConfigurationSupport 的配置生效 解决办法将 WebMvcConfigurationSupport 改造成 WebMvcConfigurer。因为多个WebMvcConfigurer 的配置的话都是会生效的 2、FastJsonHttpMessageConverter 注入到 Spring 容器中但是不起作用 原因由于 converters 是 HttpMessageConverter 的列表list而新 add 的消息转换器位于列表的最后所以可能不生效 解决办法可以使用列表 list 的 add(0, object)converters.add(0,fastJsonHttpMessageConverter)把 fastJsonHttpMessageConverter 插入列表头 九、注意事项 注意区分 configureMessageConverters 和 extendMessageConverters方 法的不同前者会覆盖掉原有的消息转换器集合而只保留当前的集合因此如果使用了这个方法就会覆盖掉默认的消息转换器集合因此这里得注意配置了新的会不会引起功能的缺失比如说默认的实际上是支持基本的 RequestBodyResponseBody 功能的配置了新的也要支持不能让这两个注解失效。如果担心的话可以使用 extendMessageConverters 方法配置消息转换器这样就不会覆盖确保了安全。Bean 和 写在 WebMvcConfigurer 里面的区别是注入bean的方式这种方法加入的转换器排序是第一位。实现 WebMvcConfigurer 接口这种方法加入的转换器排序是最后一位。 十、参考文档 WebMvcConfigurationSupport 和 WebMvcConfigurer 区别和同时使用产生的问题-解决SpringBoot的序列化和反序列化  spring-boot2.x使用EnableWebMvc注解导致的自定义HttpMessageConverters不可用
http://www.ho-use.cn/article/10814251.html

相关文章:

  • 百度网站建设要多少钱石家庄哪里做网站比较好
  • 闸北企业网站制作做网站都是怎么收费
  • 字体升级wordpress长沙seo袁飞
  • 网站不备案可以上线吗如何开展网站推广
  • 石家庄营销网站建设价格地宝网 网站建设
  • 哪个购物网站最便宜广州网站建设服务哪家好
  • 门户网站建设如何入账建e室内设计网官网图库
  • 万网虚拟机怎么做两个网站公司网站数据分析
  • 可以做外链的图片网站天辰建设信息网
  • 郑州学校网站建设网易企业邮箱名称
  • 域名抢注网站陕西建设厅执业资格注册中心网站
  • 怎么才能打开一些网站电子商务与网站建设课程
  • 长沙网站模板建设建设电商网站的总结
  • 网站建设策划书 范文高权重网站收录问题
  • 软文推广发布asp网站做seo
  • 国外设计网站都有哪些福建省建设执业继续教育网站
  • 个人网站制作教程视频平面设计免费软件有哪些
  • 陕煤化建设集团网站矿建二公司多语种网站建设
  • 网站建设首页步骤网店托管代运营费用多少钱
  • 手机网站合同网站素材模板 站长
  • 网站建设如何跑单子网页设计软件dw免费下载
  • 做动画的网站有哪些类似淘宝商城网站建设方案
  • 常州建网站需要多少钱介绍好的免费网站模板下载地址
  • 做网站的一般要多钱济宁竞价托管
  • 字画价格网站建设方案某小型网站开发公司创业策划
  • 做网站要不要钱网站制作教程设计院
  • 汉中做网站的电话wordpress与php
  • 佛山企业网站建设教程有没有做旅游攻略的网站
  • 请简述网站建设的一般流程图十大免费建站app
  • 邯郸做网站服务商国外网站建立