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

薇诺娜经常在那个网站做特价如何学好网站开发

薇诺娜经常在那个网站做特价,如何学好网站开发,公司建站花费,百度云网站入口Dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式#xff0c;本文简单介绍dubbo的序列化。本文结构#xff1a; 对象序列化是什么意思#xff1f;dubbo序列化几个问题 对象序列化是什意思#xff1f; 先来思考两个问题#xff1a; 普通的Java对象的生命周期是仅…Dubbo序列化 dubbo作为一个rpc框架支持丰富的序列化方式本文简单介绍dubbo的序列化。本文结构 对象序列化是什么意思dubbo序列化几个问题 对象序列化是什意思 先来思考两个问题 普通的Java对象的生命周期是仅限于一个JVM中的只要JVM停止这个对象也就不存在了下次JVM启动我们还想使用这个对象怎么办呢或者我们想要把一个对象传递给另外一个JVM的时候应该怎么做呢 这两个问题的答案就是将该对象进行序列化然后保存在文件中或者进行网络传输到另一个JVM由另外一个JVM反序列化成一个对象然后供JVM使用。 对象序列化就是将一个存在内存中的对象转换为可存储或者可传输的二进制流并且根据序列化的规则可以进行反序列化。一般来说需要保存的对象信息包括 类的全限定名称未被transparent修饰的字段值 将这些信息按照一定的规则转换为二进制之后进行网络传输在接收到的一端就可以根据这些信息先实例化这个类对应的对象然后将对应的属性值填入新构造的对象在使用者看来就是使用的原来的对象。 Dubbo协议 dubbo支持很多种通信协议其中dubbo协议作为默认的通信协议dubbo协议的协议格式如下 header0-1516171819-2324-3132-9596-127MAGIC (short) 0xdabbreq/resptwo /one wayevent是心跳还是正常消息serializationId 指定序列化的类型状态位 消息类型为response时设置请求响应状态消息的idlong类型body的lengthint类型body header的字段格式是固定的所以header的序列化方式也是固定的header序列化过程如下(以request的encode为例) // com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec#encodeRequest protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request req) throws IOException {// 根据配置获取序列化的协议默认是hessian2Serialization serialization getSerialization(channel);// header.byte[] header new byte[HEADER_LENGTH];// set magic number.Bytes.short2bytes(MAGIC, header);// set request and serialization flag.header[2] (byte) (FLAG_REQUEST | serialization.getContentTypeId());// oneway还是twowayif (req.isTwoWay()) header[2] | FLAG_TWOWAY;// event种类if (req.isEvent()) header[2] | FLAG_EVENT;// set request id.Bytes.long2bytes(req.getId(), header, 4);// encode request data.int savedWriteIndex buffer.writerIndex();buffer.writerIndex(savedWriteIndex HEADER_LENGTH);ChannelBufferOutputStream bos new ChannelBufferOutputStream(buffer);ObjectOutput out serialization.serialize(channel.getUrl(), bos);if (req.isEvent()) {encodeEventData(channel, out, req.getData());} else {encodeRequestData(channel, out, req.getData());}out.flushBuffer();if (out instanceof Cleanable) {((Cleanable) out).cleanup();}bos.flush();bos.close();int len bos.writtenBytes();checkPayload(channel, len);// 消息长度在消息序列化完成后才能确定消息体body的长度Bytes.int2bytes(len, header, 12);// writebuffer.writerIndex(savedWriteIndex);buffer.writeBytes(header); // write header.buffer.writerIndex(savedWriteIndex HEADER_LENGTH len);}header的序列化方式是固定的但是消息体body可以指定不同的序列化方式由于消息体可以由用户自定义所以可能是各种类型。一种序列化协议需要支持序列化和反序列化各种类型包括基础类型和类类型比如null、long、int、String、List、Map、enum、自定义类等。 dubbo中序列化协议都实现了下面的接口 com.alibaba.dubbo.common.serialize.Serialization通过SPI扩展可以实现不同的协议默认的SPI扩展是hessian2 com.alibaba.dubbo.common.serialize.support.hessian.Hessian2Serializationdubbo中的序列化、反序列化都要实现下面的接口 com.alibaba.dubbo.common.serialize.ObjectOutput com.alibaba.dubbo.common.serialize.ObjectInput比如hessian序列化和反序列化 com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectOutput com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectInput这两个类里面的方法是通过调用Hessian2Output、Hessian2Input方法实现的Hessian2Output和Hessian2Input实现了hessian协议。具体的协议内容可以参考这个 几个问题 为什么参数对象都要实现Serializable接口使用dubbo协议默认的序列化方式hessian的时候 因为dubbo使用hessian序列化方式的时候对象的序列化使用的是JavaSerializer com.alibaba.com.caucho.hessian.io.SerializerFactory#getDefaultSerializer com.alibaba.com.caucho.hessian.io.SerializerFactory#getSerializer com.alibaba.com.caucho.hessian.io.Hessian2Output#writeObject获取默认的序列化方式的时候会判断该参数是否实现了Serializable接口 protected Serializer getDefaultSerializer(Class cl) {if (_defaultSerializer ! null)return _defaultSerializer;// 判断是否实现了Serializable接口if (!Serializable.class.isAssignableFrom(cl) !_isAllowNonSerializable) {throw new IllegalStateException(Serialized class cl.getName() must implement java.io.Serializable);}return new JavaSerializer(cl, _loader); }如果没有实现Serializable接口的话就抛出异常所以在声明参数的时候参数是一个类这个类必须实现Serializable接口。 关于serialVersionUID serialVersionUID是Java原生序列化时候的一个关键属性但是在不使用Java原生序列化的时候这个属性是没有被用到的比如基于hessian协议实现的序列化方式中没有用到这个属性。 这里说的Java原生序列化是指使用下面的序列化方式和反序列化方式 java.io.ObjectOutputStream java.io.ObjectInputStream在使用原生序列化的时候serialVersionUID起到了一个类似版本号的作用在反序列化的时候判断serialVersionUID如果不相同会抛出InvalidClassException。 如果在使用原生序列化方式的时候官方是强烈建议指定一个serialVersionUID的如果没有指定在序列化过程中jvm会自动计算出一个值作为serialVersionUID由于这种运行时计算serialVersionUID的方式依赖于jvm的实现方式如果序列化和反序列化的jvm实现方式不一样可能会导致抛出异常InvalidClassException所以强烈建议指定serialVersionUID。
http://www.zqtcl.cn/news/225979/

相关文章:

  • 常熟做网站优化合肥百度竞价推广代理公司
  • 专业做招聘的网站人气最旺的传奇手游
  • 西安网站建设新闻柳市专业网站托管
  • 网站怎么做移动端织梦网暂时关闭网站
  • 上海响应式网站建设企业seo 优化是什么
  • pc主页网站建设专业公司网站建设服务公司
  • js 取网站域名做服装团购有哪些网站有哪些
  • ysl网站设计论文网站快照回档
  • 网站建设成本计划汕头网站开发服务
  • 云朵课堂网站开发怎么收费wordpress安装完不显示
  • 网站建设进什么分录wordpress5.0 安装
  • 网站建设丷金手指专业十五户县规划建设和住房保障局网站
  • 普通门户网站开发价格怎么查公司信息
  • 广告传媒公司网站怎么做高品质的网站开发公司
  • 建设品牌型网站制作一起做玩具网站
  • 中山品牌网站设计自建站怎么做
  • 最牛免费网站建设wordpress 相册功能
  • 网站开发是培训网站开发毕业设计评审表
  • 网站对网友发帖隐私做处理网站怎么上传模板
  • 网站建设大神级公司网站 百度地图
  • 网站营销定义高端网站建设免费分析
  • 韩国网站建站html5修改器下载
  • 网站做联盟广告能赚钱吗如何制作微信小程序教程
  • 免费网页代理浏览器1广州seo效果
  • 网站开发所需基础知识学网络营销有前途吗
  • php网站怎么做集群wordpress添加产品图
  • 公司怎么建立网站吗聊城高端网站建设
  • 女生做网站编辑wordpress 办公主题
  • 接单做网站的从什么网站建网站好
  • 服务器如何发布网站正能量不良网站进入窗口免费阅读