做电影资源网站有哪些网站建设项目流程图

web/2025/10/4 21:28:59/文章来源:
做电影资源网站有哪些,网站建设项目流程图,拉网线要多少钱,自己做网站需要备份么享学课堂作者#xff1a;逐梦々少年转载请声明出处#xff01;上次我们详细的学习了Java中的序列化机制#xff0c;但是我们日常开发过程中#xff0c;因为java的序列化机制的压缩效率问题#xff0c;以及序列化大小带来的传输的效率问题#xff0c;一般很少会使用原生的…享学课堂作者逐梦々少年转载请声明出处上次我们详细的学习了Java中的序列化机制但是我们日常开发过程中因为java的序列化机制的压缩效率问题以及序列化大小带来的传输的效率问题一般很少会使用原生的序列化机制而是使用常见的序列化开源框架来实现序列化操作接下来我们学习一下开发常用的序列化机制及原理分析常见的序列化框架xml序列化在java发展早期开始为了统一接口xml协议横空出世良好的可读性自由度极高的扩展性成了很长一段时间的序列化标准规范。实现xml序列化/反序列化的方案有很多最常见的是XStream 和 Java 自带的 XML 序列化和反序列化两种 并且还有基于xml协议的soap协议实现的webservice接口等。可以说xml序列化是开发中最常见也是发展时间最久的协议并且支持跨进程和跨语言交互但是缺陷也很明显即xml规范下的每一个属性和值都是固定的标签形式导致序列化后的字节流文件很大远超于java自身的序列化方案而且效率很低一般建议使用在内部系统或者性能要求不高但是对于接口的复杂度和准确性要求比较高的接口交互或者适合多语言多进程之间交互的统一规范不适合QPS过高的工程使用JSON序列化在xml序列化发展了多年后也浮现了一些问题比如开发并不简便解析xml复杂度较高还有xml的标准规范比较多自由度过高导致很难有效的指定格式校验等于是一种新的轻量级的序列化交互的方案--JSONJavaScript Object Notation出现了相对于xml来说json格式语法简单自由度较高有很高的可读性并且在JSON序列化后的字节流小于xml序列化的结果解析起来更方便于是基于JSON的接口成了新的标准规范之一到现在也出现了很多JSON的序列化/反序列化的开源框架比如开发中最常见到的Jackson、阿里巴巴开源的FastJson、谷歌的GSON等而这三种框架各有优劣通过测试一万个对象的序列化和反序列化的效率对比如下:序列化:反序列化:可以看出来序列化的时候Gson的速度明显稍微慢了一些Jackson反而最快而在反序列化的时候三个表现都很稳定时间都差不多但是当数据比较大的时候测试结果又有所不同测试结果和数据来自https://blog.csdn.net/Sword52888/article/details/81062575 提供的代码和脚本可以得出对应结论:1、 当数据小于 100K 的时候建议使用 Gson2、 当数据100K 与 1M 的之间时候建议使用各个JSON引擎性能差不多3、 当数据大与 1M 的时候建议使用 JackSon 与 FastJson而在稳定性上面默认情况下Gson在各种情况下的表现最好Jackson配合对应的配置化也能达到很好的稳定性而FastJson表现的不稳定所以对于这几种json库的使用建议环境较复杂场景下使用JackSon加上自定义的配置化可以更灵活的处理更多的场景但是在复杂度一般仅仅在乎性能的场景下建议使用FastJson因为FastJson的api更易用依赖少简单场景下使用简单Hessian序列化Hessian是一个支持跨语言传输的二进制文本序列化协议对比Java默认的序列化Hessian的使用较简单并且性能较高现在的主流远程通讯框架几乎都支持Hessian比如Dubbo默认使用的就是Hessian不过是Hessian的重构版Avro序列化Avro序列化设计初衷是为了支持大批量数据交换的应用支持二进制序列化方式并且自身提供了动态语言支持可以更加便捷、快速处理大批量的Avro数据Kyro序列化Kyro序列化是主流的比较成熟的序列化方案之一目前广泛使用在大数据组件中比如Hive、Storm等性能比起Hessian还要优越但是缺陷较明显不支持跨语言交互在dubbo2.6.x版本开始已经加入了Kyro序列化的支持Protobuf序列化Protobuf是谷歌提出的序列化方案不同的是此方案独立于语言、平台谷歌提供了多个语言如java、c、go、python等语言的实现也提供了多平台的库文件支持使用比较广泛优点在于性能开销很小压缩率很高但是缺陷也很明显可读性很差并且protobuf需要使用特定语言的库进行翻译转换使用起来较为麻烦Protobuf序列化的使用首先现在使用Protobuf有手动编译和maven依赖jar两种方案实际开发中我们一般使用maven坐标引入jar坐标如下:dependencygroupIdcom.dyuproject.protostuff/groupIdartifactIdprotostuff-core/artifactIdversion1.0.8/version/dependencydependencygroupIdcom.dyuproject.protostuff/groupIdartifactIdprotostuff-runtime/artifactIdversion1.0.8/version/dependency编写一个便捷的序列化转换工具类package com.demo.utils;import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtobufIOUtil; import com.dyuproject.protostuff.runtime.RuntimeSchema;public class SerializeUtils{/****序列化方法*/public static T byte[] serialize(T t,ClassT clazz) {return ProtobufIOUtil.toByteArray(t, RuntimeSchema.createFrom(clazz),LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));}/****反序列化方法*/public static T T deSerialize(byte[] data,ClassT clazz) {RuntimeSchemaT runtimeSchema RuntimeSchema.createFrom(clazz);T t runtimeSchema.newMessage();ProtobufIOUtil.mergeFrom(data, t, runtimeSchema);return t;}使用的时候直接使用工具类进行自动的转换传输即可注使用的时候注意jdk版本和jar版本的兼容问题并且需要序列化的实体并不需要实现Serializable 接口当然我们接下来手动编译protobuf使用了解下protobuf的语法以及原理手动编译Protobuf手动编译protobuf我们需要一个Protobuf编译器的支持这里推荐直接点击地址在github上下载:https://github.com/google/protobuf/releases或者直接百度云:http://pan.baidu.com/s/1gefsM9X 下载这里博主选择直接百度云集成的环境下载1:解压protoc-3.0.0-beta-2-win32会得到一个protoc.exe的文件.2:解压protobuf-3.0.0-beta-2.(3.0.0-beta是版本号可能会有所不同)3.将protoc.exe文件放到2步骤解压后文件夹java/src/这个目录里面(src里面不是跟src并级)4.WINDOSR 输入cmd命令并切换至3步骤的src目录的上级目录就是java目录下会发现这个目录有个POM文件使用maven编译命令编译(mvn install)然后会在java目录下生成target以及一个jar。OK到目前位置安装算完成了接下来是编译环节将上面生成的那个jar和一开始的那个exe文件放到需要编译文件的同一目录下 使用编译指令(cmd)protoc --java_outxxx/xxx.proto如果出现Missing input file错误那么就使用 以下指令:protoc xxx/xxx.proto --java_out./接下来我们开始编写一个protobuf的简单demo后缀为proto,代码如下syntaxproto2; package com.demo.serial; option java_package com.demo.serial; option java_outer_classnameUserProtos; message User { required string name1; required int32 age2; }首先我们先看看上面编写的内容分别代表什么意思:syntaxproto2;这里指定了protobuf编译的版本目前主流为proto2当然也有不少选择最新的proto3版本而每个大版本之间的差异还是很大的具体区别参见官方说明:https://developers.google.com/protocol-buffers/docs/proto3接着是:option java_package com.demo.serial这里指定的是上一行我们设置的package对应java文件里面的package名称option java_outer_classnameUserProtos这里指定了如果编译完毕生成的java类的名称message User这里的message代表给User类指定对应属性类型required string name1这里出现了一个特殊的修饰符类型required在protobuf中有如下几种修饰符:required: 格式良好的 message 必须包含该字段一次。optional: 格式良好的 message 可以包含该字段零次或一次不超过一次。repeated: 该字段可以在格式良好的消息中重复任意多次包括零。其中重复值的顺序会被保留。注意在proto3版本中为了兼容性考虑required修饰符已经取消完成这些以后我们使用指令:protoc --java_outxxx/xxx.proto生成protobuf转换后的实体类然后我们在pom中引入:dependency groupIdcom.google.protobuf/groupIdartifactIdprotobuf.java/artifactIdversion3.7.0/version /dependency然后进行序列化:UserProtos.User userUserProtos.User.newBuilder().setAge(300).setName(Mic).build(); byte[] bytesuser.toByteArray(); for(byte bt:bytes){ System.out.print(bt ); }我们将这个结果打印出来的字节如下:10 3 77 105 99 16 -84 2可以看出来序列化的数值看不明白但是的确字节数很小说明protobuf进行了算法压缩那么我们就要了解下protobuf压缩算法相关的详细操作,首先我们要知道protobuf的type对应的各个语言的类型:.proto TypeNotesC TypeJava TypePython Type[2]Go Typedoubledoubledoublefloat*float64floatfloatfloatfloat*float32int32使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值请改用 sint32int32intint*int32int64使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值请改用 sint64int64longint/long[3]*int64uint32使用可变长度编码uint32int[1]int/long[3]*uint32uint64使用可变长度编码uint64long[1]int/long[3]*uint64sint32使用可变长度编码。有符号的 int 值。这些比常规 int32 对负数能更有效地编码int32intint*int32sint64使用可变长度编码。有符号的 int 值。这些比常规 int64 对负数能更有效地编码int64longint/long[3]*int64fixed32总是四个字节。如果值通常大于 228则比 uint32 更有效。uint32int[1]int/long[3]*uint32fixed64总是八个字节。如果值通常大于 256则比 uint64 更有效。uint64long[1]int/long[3]*uint64sfixed32总是四个字节int32intint*int32sfixed64总是八个字节int64longint/long[3]*int64boolboolbooleanbool*boolstring字符串必须始终包含 UTF-8 编码或 7 位 ASCII 文本stringStringstr/unicode[4]*stringbytes可以包含任意字节序列stringByteStringstr[]byteProtobuf序列化的原理分析了解了Protobuf的type转换的格式以后我们再来看Protobuf的存储格式Protobuf采用了T-L-V的存储格式存储数据其中的T代表tag即keyL则是length代表当前存储的类型的数据长度当是数值类型的时候L被忽略V代表value即存入的值protobuf会将每一个key根据不同的类型对应的序列化算法进行序列化然后按照keyvaluekeyvalue的格式存储其中key的type类型与对应的压缩算法关系如下:write_type编码方式type存储方式0Varint(负数使用Zigzag辅助)int32、int64、uint32、uint64、sint32、sint64、bool、enumT-V164-bitfixed、sfixed64、doubleT-V2Length-delimistring、bytes、embedded、messages、packed repeated fieldsT-L-V3(弃用)Start groupGroups(deprecated)弃用4(弃用)End groupGroups(deprecated)弃用532-bitfixed32、sfixed32、floatT-V需要注意的是protobuf的key计算按照(field_number 3) | wire_type 方式计算而这里的field_number是指定义的时候该字段的域号如required string name1;这里的name字段的域号为1在protobuf中规定:如果域号在[115]范围内会使用一个字节表示Key如果域号大于等于16会使用两个字节表示Keykey编码完成后该字节的第一个比特位表示后一个字节是否与当前字节有关系即:如果第一个比特位为1表示有关即连续两个字节都是Key的编码如果第一个比特位为0表示Key的编码只有当前一个字节后面的字节是Length或者Value注意protobuf中的域号定义要小于2048 原因为最大的域号即2个字节16个比特位表示key去掉位移的三位还剩下13位再去掉两个字节开头的第一个用来表示是否存在关系的比特位即16-3-211最后只有11位参与计算二进制计算后2^11 2048 所以域号不得超过2048了解了以上的那些我们看看上述我们编写的案例算法是如何实现的呢varint编码上述我们的案例中出现了int32类型对应的压缩算法为varint我们看下age300这个值是如何序列化的可以看出来我们首先将300转为二进制结果为100101100由于当前是int32所以不足32位高位全部补0即为00000000000000000000000100101100接着第二步从低位到高位取7位8位是一个字节当前的最高位为标志位如果下一个字节内还有非0得数值(即有意义存在)则最高位补1如果没有最高位补0当最高位为0后压缩存储结束从age300我们可以看出来取7位则是0101100由于后一个字节中还存在值所以最高位补1则为10101100而下一个字节则从第8位(低位到高位)开始继续获取7个字节则为0000010由于后续的一个字节中不存在有意义的值则最高位补0代表后续不存在有意义的值了不需要继续压缩则为00000010也就是说原本32个比特位的数值现在只有16个比特位4个字节压缩到了2个字节而我们都知道计算机中高位为1代表负数计算机中对负数的计算为先将结果取反后再去补码操作而负数的补码则是在反码的基础上1那么我们现在将结果反过来先去-1得到反码则为10101011再去取反得到原码则为01010100现在我们将这个值转换为十进制则可以知道结果为84由于高位为1则代表是负数最终结果为-84而00000010由于高位是0代表本身为正数正数的原码反码补码都是自身所以直接转换为十进制结果为2现在我们把这两个结果和上述打印的结果比较一下是不是发现是一样的当然我们也从这个过程中发现了一些问题比如小于128的值我们甚至只需要1个字节就能存储完毕但是如果我们需要存储的值很大超过了268435455以后的数值甚至需要五个字节来存储(超过28个有效比特位),但是绝大多数情况下我们都不会使用这么大的数值所以一般情况下我们都能比之前使用更小的字节存储达到压缩的目的字符串压缩在Protobuf中存储字符串格式使用的T-L-V存储方式标识符Tag采用Varint编码字节长度Length采用Varint编码string类型字段值采用UTF-8编码方式存储所以tag得值为1 3 | 2 10L的值存储为00000011即为3而V的存储把每一个字符按照UTF-8的编码后的字节流数组分别为77 105 99而在Protobuf编码后的字节流则是按照如图的顺序所以打印出来的结果如上的10 3 77 105 99 16 -84 2负数存储-write_type为0在计算机中负数会被表示为很大的整数因为计算机定义负数符号位为数字的最高位所以如果采用 varint 编码表示一个负数那么一定需要 5 个比特位。所以在 protobuf 中通过sint32/sint64 类型来表示负数负数的处理形式是先采用 zigzag 编码把符号数转化为无符号数在采用 varint 编码。sint32(n 1) ^ (n 31)sint64(n 1) ^ (n 63)比如存储一个-300的值-300原码0001 0010 1100取反1110 1101 0011加 1 1110 1101 0100n1: 整体左移一位右边补 0 - 1101 1010 1000n31: 整体右移 31 位左边补 1 - 1111 1111 1111n1 ^ n 311101 1010 1000 ^ 1111 1111 1111 0010 0101 0111十进制 0010 0101 0111 599然后再使用varint 算法得到两个字节1101 0111(-41),0000 0100(4)总结基于Protobuf序列化原理分析为了有效降低序列化后数据量的大小可以采用以下措施字段标识号Field_Number尽量只使用1-15且不要跳动使用 Tag是需要占字节空间的。如果Field_Number16时Field_Number的编码就会占用2个字节那么Tag在编码时就会占用更多的字节如果将字段标识号定义为连续递增的数值将获得更好的编码和解码性能若需要使用的字段值出现负数请使用sint32/sint64不要使用int32/int64。 采用sint32/sint64数据类型表示负数时会先采用Zigzag编码再采用Varint编码从而更加有效压缩数据对于repeated字段尽量增加packedtrue修饰 增加packedtrue修饰repeated字段会采用连续数据存储方式即T - L - V - V -V方式2.将结果赋值给a则a 3public static void main(String[] args){int a 8;a ^ 11;//a 8^11 3System.out.println(a);//3}既然来了点个关注再走呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宁波网站seo哪家好桂林市区有什么好玩的

2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能&#xff0…

字体图标制作网站网页二级页面怎么做

项目应用场景 面向行人重识别场景,项目具有轻量化 (训练的时候也只需要 2GB 的显存占用)、性能好 (只使用 softmax 损失就能够达到 Rank188.24%, mAP70.68%),另外提供友好的上手项目流程教程 项目效果: 项目流程 > 具体参见项目内README.…

网站开发后台 ampsns网站设计

object-fit 属性可以设置以下值: 属性值说明例子fill填充容器,可能会改变图片的比例。object-fit: fill;contain保持图片的原始比例,确保图片完全包含在容器内。object-fit: contain;cover保持图片的原始比例,确保图片覆盖整个容…

网站站外优化推广方式郑州网站开发工程师

Win10操作系统的任务管理器应该是大家比较熟悉的软件,尤其是在你的电脑卡掉的时候,不得不打开任务管理器,结束掉进程卡死的进程,然后电脑就可以恢复正常使用,任务管理器作为Windows操作系统上一款使用频率非常高的软件…

一台服务器可以建设几个网站wordpress 静态化插件

安装其他插件的时候,常常模板丢失,比较郁闷,以前就用土办法,重装VS来解决这个问题,这次终于弄清楚怎么回事了,可以采取下面两个步骤解决1。复制ProjectTemplates和ItemTemplates,保证VS能找到相…

网站服务公司特点做慕墙上什么网站好找事做

NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协…

番禺做网站技术超酷网站模板

简介 我们知道多个DS18B20的DQ线是可以被挂在一起的, 也就是一根线上可以访问不同的DS18B20而不会造成数据错乱, 怎么做到的,其实数据手册都有说到, 就是靠64-bit ROM code 进行识别, 也可以理解成Serial Number进行识别, 因为主要差异还是在Serial Numb…

网站开发 兼职挣钱吗网络推广服务合同范本

变量生而不变,允许优化,JDK1.5 pre 避免,逸出 final int x; // 错误的构造函数 public FinalFieldExample(){x 3;// 此处就是将this逸出global.obj this; }

公司的网站建设公司seo的主要工作内容

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。 在本文中,我将使用Java流ORM Speedment,因为它包含一个现成的Permutation类,从而帮助我节省了开发时间。…

东莞网站建设化工wordpress移动端适应

BAPI_PR_CREATE 技术指南 用途:通过 RFC 接口创建 SAP 采购申请(PR),支持自动化集成与批量处理。 一、功能概览 类别说明核心功能创建标准采购申请、预留转采购申请,支持多行项目及账户分配。集成场景与 MRP 系统、外…

注册建设网站的公司seo优化6个实用技巧

HTML详解连载(1) HTML定义HTML 超文本标记语言标签语法注意拓展 HTML基本骨架解释VS Code 快速生成骨架:标签的关系父子关系(嵌套关系)兄弟关系(并列关系) 代码格式注释 标题标签标签名:h1-h6(双…

东莞网站推广服务湖南省住房和建设厅网站

HBase 中设计 RowKey 在 HBase 中设计 RowKey 是非常重要的,它直接影响着数据的存储和检索效率。下面是一些设计 RowKey 的原则: 1. 唯一性(Uniqueness):RowKey 必须是唯一的,因为在 HBase 中,数…

公司网站模块制作自建网站做外贸

Q-learning、DQN算法是基于价值的算法,通过学习值函数、根据值函数导出策略;而基于策略的算法,是直接显示地学习目标策略,策略梯度算法就是基于策略的算法。 策略梯度介绍 将策略描述为带有参数 θ \theta θ 的连续函数&#…

响应式网站切图网上推广是什么意思

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

70 网站制作wordpress 5.1.1

发布时间:2017-09-25我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣的玩家不妨进来看看哦! 在一个rpg服务器玩 开小号召唤boss的时候发现的. ...标签:我的世界…

朝阳双桥网站建设外贸网络推广专员

欢迎您成为我的读者,希望这篇文章能给你一些帮助。前言日常编码过程中,最重要的技能不是说你学会使用很多最新的编程技术或者做出一个高大上的系统。而是你在写代码过程中,对异常的处理,是否系统可以稳定,健壮。对于异…

网站搭建上海建设工程咨询网 首页

在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是And…

wordpress只显示首页网站优化设计

复杂数据结构处理:Join 小技巧:提升数据的处理速度 本文是在原本sql闯关的基础上总结得来,加入了自己的理解以及疑问解答(by GPT4) 原活动链接 用到的数据:链接 提取码:l03e 目录 1. 课前小问…

浙江和海建设集团网站首页社区电商平台排行榜

非监督学习 1 什么是非监(unsupervised learning)督学习 无监督学习,就是不受监督的学习,一种自由的学习方式。该学习方式不需要先验知识进行指导,而是不断地自我认知,自我巩固,最后进行自我归纳,在机器学…

校园网站规划与建设心得甘肃兰州做网站

之前看到一个项目不能继承类SimpleTagSuppert类,而将jsp-api.jar(不知道servlet-api.jar能不能放)放入到了 jdk/jre/lib/ext包下面结果不仅正在写的jsp不能运行,以前的web应用也不能运行,会出现 java.lang.ClassNotFo…