序列化

序列化和反序列化

我怕爱的太早我们不能终老 提交于 2020-02-06 00:25:59
1, 摘要   序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式、大数据量系统设计里面更为显著。恰当的序列化协议不仅可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统更加易于调试、便于扩展。本文从多个角度去分析和讲解“序列化和反序列化”,并对比了当前流行的几种序列化协议,期望对读者做序列化选型有所帮助。   简介   文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每天billion级别的高质量个性化推荐以及排序服务。从Terabyte级别的用户行为数据,到Gigabyte级别的Deal/Poi数据;从对实时性要求毫秒以内的用户实时地理位置数据,到定期后台job数据,推荐与重排序系统需要多种类型的数据服务。推荐与重排序系统客户包括各种内部服务、美团客户端、美团网站。为了提供高质量的数据服务,为了实现与上下游各系统进行良好的对接,序列化和反序列化的选型往往是我们做系统设计的一个重要考虑因素。   本文内容按如下方式组织: 第一部分给出了序列化和反序列化的定义,以及其在通讯协议中所处的位置。 第二部分从使用者的角度探讨了序列化协议的一些特性。

[C#] CSharp 基本语法

与世无争的帅哥 提交于 2020-02-05 17:41:36
一、基础 1.规范: 除常量外,所有变量用驼峰命名方式,其它用帕斯卡命名方式. 2.编译: 首先由csc.exe将cs文件编译成MSIL.当双击exe的时候,会由clr的jit(just in time)编译器再次编译成cpu指令. csc位置(如):C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe csc命令(如): csc /t:library acme.cs(编译成类库) csc /r:acme.dll test.cs(引用acme.dll后编译) ngen位置(如):C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe(可实现jit效果) ngen命令(如):ngen install D:\SystemTool\HelloWorld.exe (备注:exe方式) 3.面向对象(Object-Oriented 面向对象编程:Object-Oriented-Programming): 类是抽象的,对象是具体的. 析构函数:~ClassName(){}.实际是重写基类的Finalize()方法 4.变量: 成员变量:默认有一个初始值.string->null,int->0,bool->false 局部变量:使用前必须赋值. 5.封装: a.字段封装成属性 b

Java系统高并发之Redis后端缓存优化

三世轮回 提交于 2020-02-05 07:26:18
一:前端优化 暴露接口,按钮防重复(点击一次按钮后就变成禁用,禁止重复提交) 采用CDN存储静态化的页面和一些静态资源(css,js等) 二:Redis后端缓存优化 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。 利用Redis可以减轻MySQL服务器的压力,减少了跟数据库服务器的通信次数。 2.1 Redis服务端下载以及安装 详细步骤参考: Redis服务端安装教程 注:以下pom.xml为Maven项目配置文件,若非Maven项目,百度相应名称包导入即可。 2.2 在pom.xml中配置Redis客户端 <!-- redis客户端:Jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> 由于Jedis并没有实现内部序列化操作,而Java内置的序列化机制性能又不高

.Net Core下自定义JsonResult

。_饼干妹妹 提交于 2020-02-05 03:38:07
自定义JsonResult其实就是利用了过滤器来实现的,过滤器的概念其实跟.net framework中差不多,不明白的可以去补习下相关知识点。 为什么要自定义JsonResult呢,因为mvc 要把json序列化都通过Newtonsoft来实现,之前在.net framework也是这么来操作的,因为.net自带的序列化方法对日期格式显示并不是我们要的格式,当然也可以用其他方法来实现如 自定义日期格式 这边要特别说明下,之前在.net framework中如果HttpGet返回JsonResult时需要加上JsonRequestBehavior.AllowGet这么一句话,而在.net core下没有此方法了,那我们要返回JsonResult怎么办呢,就直接加上特性[HttpPost]行了。 这也正是自定义JsonResult时跟之前.net framework时不同的地方 方法,自定义NewJsonResult继承JsonResult 然后重写ExecuteResult方法 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; using Microsoft.AspNetCore.Http; /

Google Gson-反序列化列表 宾语? (通用类型)

人盡茶涼 提交于 2020-02-05 01:42:01
我想通过Google Gson 传输列表对象,但是我不知道如何反序列化泛型类型。 在查看 此内容 后我尝试了什么(BalusC的答案): MyClass mc = new Gson().from Json (result, new List<MyClass>(){}.getClass()); 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法...”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 Type listType = new TypeToken<List<MyClass>>() { }.getType(); MyClass mc = new Gson().fromJson(result, listType); 但是,在“ fromJson”行中确实得到以下异常: java.lang.NullPointerException at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47) at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83) at

blackhat-New-Exploit-Technique-In-Java-Deserialization-Attack-笔记

◇◆丶佛笑我妖孽 提交于 2020-02-04 19:08:01
java反序列化的攻击场景: 1.远程服务接收了不被信任的反序列化数据 2.classpath中存在序列化所需要的类 3.序列化的类中存在危险函数 从上面3点看出和以前看php的反序列化攻击场景从宏观上看差不多,首先是接收数据时反序列化了不被信任的序列化数据,php的当然是固定的unserialize函数,而java中通过调用对象输入流的readObject函数来进行反序列化,unserialize只需要从该入口向下找,而java则通常是先找到readObject函数再向上找对象是否可控 magic callback: 相对于php反序列化要执行的__destruct、__wakeup,java主要包括: 比如这里就以反序列化导致文件删除为例子进行了一个说明,这个也是个cve,ysoserialize中也有该攻击链 一些常用的防御方法: 1.在反序列化的过程中验证输入流,如果反序列化所需要的类在黑名单中,则停止序列化的过程,weblogic就用的是加黑名单的方式保护应用 2.jep290机制 即输入的反序列化数据进行过滤,官方从8u121,7u13,6u141分别支持了这个JEP, http://openjdk.java.net/jeps/290 官方说明文档 3.rasp技术 4.java agent 上面讲了一些防御方法,然后就提出要找更基础的攻击向量 JDBC

精选干货 在java中创建kafka

只谈情不闲聊 提交于 2020-02-04 17:34:15
这个详细的教程将帮助 你 创建一个简单的 Kafka生产者,该生产者可将记录发布到Kafka集群 。 通过优锐课的java学习架构分享中,在本教程中,我们将创建一个简单的 Java示例,该示例创建一个Kafka生产者。 你 创建一个名为 my-example-topic的新复制的Kafka主题,然后创建一个使用该主题发送记录的Kafka生产者。将向Kafka制作人发送记录。同步发送记录 , 稍后, 你 将异步发送记录。 在你开始前 本教程的前提条件是命令行中的 Kafka以及Kafka群集和故障转移基础知识。 本教程是系列教程的一部分。 如果不确定什么是卡夫卡,则应从什么开始。 如果 你 不熟悉 Kafka的体系结构,那么建议 你 阅读 Kafka Architecture,Kafka Topics Architecture,Kafka Producer Architecture和Kafka Consumer Architecture。 创建复制的 Kafka主题 #!/usr/bin/env bash cd ~/kafka-training ## Create topics kafka/bin/kafka-topics.sh --create \ --replication-factor 3 \ --partitions 13 \ --topic my-example-topic

Java 对象序列化

守給你的承諾、 提交于 2020-02-04 12:45:02
文章目录 什么是序列化? 举例:(定义一个可以被序列化的类) 序列化与反序列化 举例:(实现序列化与反序列化) transient 关键字 举例:(transient 关键字的使用) 什么时候会使用到 transient 关键字? 几乎只要是 Java 开发就一定会存在有序列化的概念,而正是因为序列化的概念逐步发展,慢慢地也有了更多 的序列化标准 什么是序列化? 所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输 然而并不是所有的对象都可以被序列化的,在 Java 里面有一个强制性的要求:如果要序列化的对象,那么对象所在的类一定要实现 java.io.Serializable 父接口,作为序列化的标记,这个接口并没有任何的方法,为什么?因为它描述的是一种类的能力 举例:(定义一个可以被序列化的类) class Person implements Serializable { // Person 类可以被序列化 private String name ; private int age ; public Person ( String name , int age ) { this . name = name ; this . age = age ; } // 省略 setter getter @Override public

java 序列化

烂漫一生 提交于 2020-02-04 12:42:50
首先什么是序列化: 通过对百度百科搜索得到, 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间, 对象将其当前状态写入到临时或持久性存储区 。以后, 可以通过从存储区中读取或反序列化对象的状态,重新创建该对象 。 目的 1、以某种存储形式使自定义 对象持久化 ; 2、将对象从一个地方传递到另一个地方。 3、使程序更具维护性。 序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。 使用场景:所有可在网络上传输的对象都必须是可序列化的, 比如RMI(remote method invoke,即远程方法调用),传入的参数或返回的对象都是可序列化的,否则会出错; 所有需要保存到磁盘的java对象都必须是可序列化的 。 如果需要序列化,java类都实现Serializeable接口。 有些时候我们有一些需求,一些属性不需要序列化,那么就需要使用transient关键字修饰不需要序列化的字段 学习blog:https://www.cnblogs.com/9dragon/p/10901448.html 来源: https://www.cnblogs

二 模块 logging json pickle re

 ̄綄美尐妖づ 提交于 2020-02-04 05:19:50
1 logging 日志模块 1.1 函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。 灵活配置日志级别,日志格式,输出位置: import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/tmp/test.log', filemode='w') logging