序列化概述

序列化与TCP/IP协议

  • TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型。在OSI七层协议模型中展现层(Presentation Layer)的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象–这两个功能就是序列化和反序列化。一般而言,TCP/IP协议的应用层对应与OSI七层协议模型的应用层,展示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。
  1. 序列化: 将数据结构或对象转换成二进制串的过程,对象序列化通常用于两个目的:
    (1) 将对象存储于硬盘上 ,便于以后反序列化使用
    (2)在网络上传送对象的字节序列
  2. 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
  • TCP、UDP,简单的说是两个最基本的协议,很多其它协议都是基于这两个协议如,http就是基于tcp的,用socket可以创建tcp连接,也可以创建udp连接。常见的一些序列化的协议,比如protocolbuf, tars,thrift等都是在应用层的协议,我们不借助于http传输的时候都是在基于这些序列化的协议基础上实现的自定义的应用层通信协议。应用层负责应用程序之间的数据沟通-----协议都是用户自己定的。在设计的程序中先完成了数据的序列化操作再使用socket通信传输二进制串。
  • TCP/IP传送数据的形式有三种:
    1.字符串形式:被传送的状态数据按ASCII字符串形式编码,每个字节代表一个字符。
    2.二进制形式:和字符串形式对应,被传送的数据不使用ASCII编码,而是直接以二进制形式传送。
    3.位图形式:位图是一个位(bit)的序列,该序列中的每一位代表一个状态,某位为1表示其代表的状态是当前状态,为0表示其代表的状态不是当前状态。

二进制串

  • 二进制串:序列化所生成的二进制串指的是存储在内存中的一块数据。C++语言具有内存操作符,所以二进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,因为其本质上就是以’\0’结尾的存储在内存中的二进制串。在Java语言里面,二进制串的概念容易和String混淆。实际上String 是Java的一等公民,是一种特殊对象(Object)。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。二进制串在Java里面所指的是byte[],byte是Java的8中原生数据类型之一(Primitive data types)。
  • 网络传输需要将对象转换成字节流传输,序列化可以将一个对象转化成一段字节编码,以便在网络上传输或者做存储处理,使用时再进行反序列;而字符串不用序列化的原因是字符串String是已经实现了Serializable接口的,所以它已经是序列化了的。

图片的序列化

  • 在计算机中, 图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用RGB或RGBA表示。RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。
  • 图片的序列化:图片序列化为字符串:
        /// 将图片序列化为字符串的方法
        private string SerializeImage(Image _Image)
  • 图片的反序列化:将字符串反序列化为图像
        /// 将字符串反序列化为图像的方法
        private Image DeserializeImage(string menuimage
  • 标准位图格式,未经过压缩,一般图像文件会比较大。bmp、jpeg、png等可以看做为图片的压缩协议。

JSON序列化

  • 网络传输中使用字符串进行交互,JSON是一种特殊规范的字符串,有自己的格式规定,与String的显示形式一样,但本质不是String!各端都支持JSON串的格式,将JSON容易转化为String进行网络传输。
  • fastJson中JSON.toJSONString(对象)将对象转为JSONString,进行网络传输。
    JSON.toJSONString(refundRequestDto)
  • 接收端接收得到的response为二进制串,JSONString。需要反序列化转化为JSONObject(真正的JSON,比String增强了按key取值的功能)。
    JSONObject object = JSON.parseObject(response);

HTTP的序列化

  • 应用层协议通常在应用层我们使用的都是Http协议,Http的本质是一次socket请求的连接与断开,服务端使用Content-Type:”application/json”编码http请求内容并提交给服务端;前端使用Content-Type:”application/json”解码http响应body内容。socket只是一种连接模式,不是协议,socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

  • HTTP请求头和响应头都是以ASCII文本方式传输的,但是传输内容(请求响应体)可能是多种形式的。接收方处理数据时是根据请求头/响应头中的content-type属性来处理的。 Content-Type:image/gif 这说明传输的是一个image对象(二进制数据),该对象为gif格式,Content-length:91 这说明传输的数据大小为91个字节,响应头若没有Transfer-Encoding这个字段,说明传输的数据没有经过任何形式的编码转换,传输的就是源文件的内容。在获取消息体参数前,可以通过调用request.setCharacterEncoding(charset)来设置消息体的解码字符集。

  • http报文一般有报文首部和报文主体构成。请求报文首部和请求报文主体一般按ascii码序列化。中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8。Tomcat8以上默认是UTF-8。报文主体按content-type反序列化。协议规定post提交的数据,必须包含在报文主体中,但是协议并没有规定数据使用什么编码方式,开发者可以自己决定消息主体的content-type格式(解码格式)

  • 接收端首先从返回头header中查找编码方案标注(Content-Type),一般接收端会根据content-type字段来获取参数是怎么编码的,然后对应去解码。
    1、浏览器对响应头与响应体按照ascii解码为字符;
    2、字符反转义:浏览器响应头进行url编码反转义,
    3、对响应体查看content-type来进行html解析或者图片解析;

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值