序列化

Java集合(2)一 ArrayList 与 LinkList

梦想与她 提交于 2020-03-31 08:54:02
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树、TreeMap与TreeSet(上) Java集合(4)一 红黑树、TreeMap与TreeSet(下) Java集合(5)一 HashMap与HashSet 引言 ArrayList<E>和LinkList<E>在继承关系上都继承自List<E>接口,上篇文章我们分析了List<E>接口的特点:有序,可以重复,并且可以通过整数索引来访问。 他们在自身特点上有很多相似之处,在具体实现上ArrayList<E>和LinkList<E>又有很大不同,ArrayList<E>通过数组实现,LinkList<E>则使用了双向链表。将他们放到一起学习可以更清楚的理解他们的区别。 框架结构 从上面的结构图可以看出ArrayList<E>和LinkList<E>在继承结构上基本相同,值得注意的是LinkList<E>在继承了List<E>接口的同时还继承了Deque<E>接口。 Deque<E>是一个双端队列的接口,LinkList<E>由于在实现上采用了双向链表,所以可以很自然的实现双端队列头尾进出的特点。 数据结构 上一篇文章中我们说过,为什么一个Collection<E>接口会衍生出这么多实现类,其中最大的原因就是每一种实现在数据结构上都有差别

序列化和反序列化的底层实现原理是什么?

﹥>﹥吖頭↗ 提交于 2020-03-31 06:35:12
转载自: https://blog.csdn.net/xlgen157387/article/details/79840134 序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知! 一、基本概念 1、什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程; (2)**序列化:**对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。 (3)**反序列化:**客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。 (4)本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流

五分钟学后端技术:如何学习Java工程师必须要会的RPC

╄→尐↘猪︶ㄣ 提交于 2020-03-30 23:01:00
声明 本文转自https://developer.51cto.com/art/201906/597963.htm 什么是RPC RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。 RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有: 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。 通信框架:MINA 和 Netty。 目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。 常用的RPC框架 gRPC:是 Google 公布的开源软件,基于最新的 HTTP 2.0 协议,并支持常见的众多编程语言。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。 Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架。 用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的

ajax的序列化表单提交

微笑、不失礼 提交于 2020-03-30 20:54:07
通过传统的 form 表单提交的方式上传文件 ? 1 2 3 4 <form id= "uploadForm" action= "" method= "post" enctype= "multipart/form-data" > <p>上传文件:<input type = "file" name= "file" /></p> <input type= "submit" value= "上传" /> </form> 不过传统的 form 表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,这种时候我们都是使用 Ajax 的方式进行请求的。 使用 serialize() 对 form 表单进行序列化提交 ? 1 2 3 4 5 6 7 8 9 $.ajax({ url: "" , type: "POST" , data: $( '#uploadForm' ).serialize(), success: function (data) { }, error: function (data) { } }); 如上,通过$('#uploadForm').serialize()可以对 form 表单进行序列化,从而将 form 表单中的所有参数传递到服务端。 但是上述方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的。不过如今主流浏览器都开始支持一个叫做

python模块:JSON模块

放肆的年华 提交于 2020-03-30 20:38:26
目录 在日常开发中,对数据进行序列化和反序列化,是常备的操作。而在Python标准库中提供了json模块对JSON数据的处理功能。 什么是json? JSON(JavaScript Object Notation)是一种使用广泛的轻量数据格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。 Json 模块提供了四个方法: dumps、dump、loads、load。 Python的Json模块序列化与反序列化的过程分别是 encoding和 decoding encoding:把一个Python对象编码转换成Json字符串 decoding:把Json格式字符串解码转换成Python对象 对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。 JSON 序列化 JSON 序列化,是把一个Python对象编码转换成Json字符串。 具体的操作为: json.dumps() import json Json_str = [ {"name":"Tom", "aga":20}, {"name":"Jack", "aga":16} ] student =json.dumps(Json_str) print(type(student)) #<class 'str'>

hadoop-序列化

一个人想着一个人 提交于 2020-03-30 19:29:20
1.序列化概述   1.1 什么是序列化     序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输;     反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象;   1.2 为什么要序列化     一般来说,“活的”对象只生存在内存中,关机断电就没有了;而且“活的”对象只能由本地的进程使用,不能发送到网络上的另外一台计算机;然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机;   1.3 为甚不用java的序列化     java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种效验信息,Header,继承体系等),不便于在网络中高效传输,所以,hadoop自己开发了一套序列化机制(Writable);   1.4 hadoop序列化特点     1.4.1 紧凑:高效使用存储空间;     1.4.2 快速:读写数据的额外开销小;     1.4.3 可扩展:随着通信协议的升级而可升级;     1.4.4 互操作:支持多语言的交互; 2.自定义bean对象实现序列接口(Writable)   在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在hadoop框架内部传递一个bean对象

.NET Core .NET标准REST库Refit

梦想的初衷 提交于 2020-03-30 19:02:00
1.简介 Refit 是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库。通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST API返回的数据转化为 POCO(Plain Ordinary C# Object,简单C#对象) to JSON。我们的应用程序通过Refit请求网络,实际上是使用Refit接口层封装请求参数、Header、Url等信息,之后由HttpClient完成后续的请求操作,在服务端返回数据之后,HttpClient将原始的结果交给Refit,后者根据用户的需求对结果进行解析的过程。安装组件命令行: Install-Package refit 代码例子: [Headers("User-Agent: Refit Integration Tests")]//这里因为目标源是GitHubApi,所以一定要加入这个静态请求标头信息,让其这是一个测试请求,不然会返回数据异常。 public interface IGitHubApi { [Get("/users/{user}")] Task<User> GetUser(string user); } public class GitHubApi { public async Task<User> GetUser() { var gitHubApi =

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

六眼飞鱼酱① 提交于 2020-03-30 04:00:35
JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Script.Serialization命名空间下。 一、属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度。 RecursionLimit 获取或设置用于约束要处理的对象级别的数目的限制。 二、方法 ConvertToType<(Of <(T>)>) 将给定对象转换为指定类型。 Deserialize<(Of <(T>)>) 将指定的 JSON 字符串转换为 T 类型的对象。 DeserializeObject 将指定的 JSON 字符串转换为对象图。 RegisterConverters 使用 JavaScriptSerializer 实例注册自定义转换器。 Serialize 已重载。 将对象转换为 JSON 字符串。 给个示例,主要就是了解了一下Serialize与Deserialize两个方法,控制器代码: public class HomeController : Controller { public

ysoserial分析【二】7u21和URLDNS

落花浮王杯 提交于 2020-03-30 02:49:19
目录 7u21 gadget链分析 hashCode绕过 参考 URLDNS 7u21 7u21中利用了TemplatesImpl来执行命令,结合动态代理、AnnotationInvocationHandler、HashSet都成了gadget链。 先看一下调用栈,把ysoserial中的调用栈简化了一下 LinkedHashSet.readObject() LinkedHashSet.add() Proxy(Templates).equals() AnnotationInvocationHandler.invoke() AnnotationInvocationHandler.equalsImpl() Method.invoke() ... TemplatesImpl.getOutputProperties() TemplatesImpl.newTransformer() TemplatesImpl.getTransletInstance() TemplatesImpl.defineTransletClasses() 对_bytecodes属性的值(实例的字节码)进行实例化 RCE 其中关于 TemplatsImpl 类如何执行恶意代码的知识可以参考另一篇文章中对CommonsCollections2的分析,这里不再赘述。只要知道这里调用 TemplatesImpl

Hadoop技术内幕HDFS-笔记3之序列化

北城余情 提交于 2020-03-29 00:58:34
1.1. 序列化 org.apache.hadoop.io包 序列化:将一个对象编码为一个字节流 反序列化:相反过程 用途: 1、 作为一种持久化格式:可存储在硬盘上,供以后反序列化使用 2、 作为一种通信数据格式:可在JVM之间,通过网路相互传递 3、 复制的机制:深度复制 1.1.1. java内建序列化机制: 只有实现Serializabl接口(声明)即可。 对象输出流ObjectOutputStream 的writeObject(obj)方法 序列化输出的结果中包含了大量与类有关的信息。 对象输入流ObjectInputStream的readObject()方法,读取对象时必须小心跟踪存储对象的数量、顺序和类型 对于父类的处理,如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反串行化的时候,默认构造函数会被调用(即会调用构造方法创建新的对象)。但是若把父类标记为可以串行化,则在反串行化的时候,其默认构造函数不会被调用。这是为什么呢?这是因为Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成(即无新的对象进行构造)。 package com.test; import java.io.FileInputStream; import java.io