序列化

单例模式(Singleton Pattern)

半城伤御伤魂 提交于 2020-02-17 02:14:04
单例模式( Singleton Pattern) 使用场景: 独一无二 确保一个类在任何情况下都绝对只有一个实例,并只提供一个全局访问点。 优缺点 优:保证内存中只有一个实例,减少了内存开销,避免对资源的过多占用。 类图: 略 源码实例: ServletContext、ServletContextConfig、在 Spring 框架应用中 ApplicationContext、数据库连接池。 使用建议: 建议使用内部类创建单例模式、兼顾性能与线程安全。 实现方式(4种): (一)懒汉式: 优点:使用时创建实例、不浪费内存空间 缺点:部分实现方式线程不安全、通过加锁虽保证线程安全但影响性能。 package com.knowledge.system.software_design_pattern.singleton_pattern.course_instance.lazy_singleton; /** * @program: demo-pom * @description: 懒汉式 * @author: bo.hu * @create: 2020-01-19 16:32 **/ public class LazySingleton<Syncchronized> { private static LazySingleton lazySingleton=null; private

Python—常用模块

荒凉一梦 提交于 2020-02-16 01:23:40
什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。 但其实import加载的模块分为四个通用类别:    1 使用python编写的代码(.py文件)   2 已被编译为共享库或DLL的C或C++扩展   3 包好一组模块的包   4 使用C编写并链接到python解释器的内置模块 为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。 常用模块 collections模块 在内置数据类型(dict、list、set、tuple)的基础上, collections模块 还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列

javaSE学习笔记(15) ---缓冲流、转换流、序列化流

冷暖自知 提交于 2020-02-15 23:46:31
javaSE学习笔记(15) ---缓冲流、转换流、序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,相当于是对基本流对象的一种增强。 概述 缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流 : BufferedInputStream , BufferedOutputStream 字符缓冲流 : BufferedReader , BufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 字节缓冲流 构造方法 public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。 public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。 构造举例,代码如下: // 创建字节缓冲输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"

微服务架构到底应该如何选择?

混江龙づ霸主 提交于 2020-02-15 22:35:23
原文: 微服务架构 微服务架构到底应该如何选择? 什么是微服务? 微服务的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通讯。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。 微服务是SOA架构下的最终产物,该架构的设计目标是为了肢解业务,使得服务能够独立运行。 主要有一下几个特点 服务拆分粒度更细 微服务可以说是更细维度的服务化,小到一个子模块,只要该模块依赖的资源与其他模块都没有关系,那么就可以拆分为一个微服务。 服务独立部署 每个微服务都严格遵循独立打包部署的准则,互不影响。比如一台物理机上可以部署多个 Docker 实例,每个 Docker 实例可以部署一个微服务的代码。 服务独立维护 每个微服务都可以交由一个小团队甚至个人来开发、测试、发布和运维,并对整个生命周期负责。 服务治理能力要求高 因为拆分为微服务之后,服务的数量变多,因此需要有统一的服务治理平台,来对各个服务进行管理。 微服务架构下,服务调用主要依赖下面几个基本组件: 服务描述 注册中心 服务框架 服务监控 服务追踪 服务治理 开源RPC框架介绍 Dubbo

61.序列化二叉树

拥有回忆 提交于 2020-02-15 16:43:14
题目 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 思路 思路一 非递归用按层序列化和反序列化。代码贼长。 序列化:用队列,结点进队列。每次一个结点处队列,将结点的左右孩子序列化,如果孩子不为空,将数字和!加入到字符串中,同时让孩子进队列。如果为空,把‘#’加入到字符串中。 反序列化,也要用到一个队列。先构建根结点,如果字符串中当前字符为‘#’,则跟节点的孩子为空。反之构造新结点,同时将新创建的孩子结点放入队列中,在下一次循环开始时,出队列一个结点,继续确定并左右孩子,然后将非空结点放入队列中… 循环直到队列为空。 思路二 用递归的方法,代码较短。 使用前序遍历 代码一 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL),

Flink Connectors 介绍与 Kafka Connector

时间秒杀一切 提交于 2020-02-15 08:45:32
文章目录 1. Streaming Connectors 预定义的 source 和 sink Boundled connectors Apache Bahir 中的连接器 异步 IO 2. Flink Kafka Connector 2.1 Flink Kafka Consumer 1)反序列化 2)消费起始位置设置 3)topic 和 partition 动态发现 4)commit offset 方式 5)Timestamp Extraction/Watermark 生成 2.2 Flink Kafka Producer 1)Producer 写出时的 Partition 分区 2)Producer 容错 3. Q&A 1. Streaming Connectors Connector 的作用就相当于一个连接器,连接 Flink 计算引擎跟外界存储系统。 目前常用的 Connector 有以下几种: 预定义的 source 和 sink 基于文件的 source 和 sink // 从文本文件中读取数据 env . readTextFile ( path ) ; // 以文本的形式读取该文件中的内容 env . readFile ( fileInputFormat , path ) ; // 将结果已文本格式写出到文件中 DataStream . writeAsText (

FastJson使用一些坑点注意

☆樱花仙子☆ 提交于 2020-02-14 18:35:35
坑点一:序列化的时候默认把null值抹掉 坑点二:序列化后顺序错乱 上述问题解决方法: JSONObject.parseObject(wholeStr, new TypeReference<LinkedHashMap<String,Object>>(){}, Feature.OrderedField); 说明: 1.new TypeReference<LinkedHashMap<String,Object>>()可以保留null值,Map<String,Object>类型才行,如果value也是String类型 一样null值也没掉,因为默认被序列化了 2. Feature.OrderedField 这个按原来顺序排序 3.LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序 来源: CSDN 作者: 空~自由 链接: https://blog.csdn.net/liu_xue_xue/article/details/104308741

Object IO Exercise

☆樱花仙子☆ 提交于 2020-02-14 00:34:20
Object IO Exercise 介绍: 解决多个对象存储到文件中,从文件中取出多个对象 分析: 1.定义一个存储person类的集合的ArrayList 2.往ArrayList中存储Person对象 3.创建一个序列化流ObjectOutputStream对象 4.使用ObjectOutputStream对象中的方法writeobject,对集合进行序列化 5.创建一个反序列化ObjectInputStream对象 6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合 7.把Object类型中的集合转换为Arraylist类型 8.遍历ArrayList集合 9.释放资源 创建person对象 补充: 列化和反序列化的时候会抛出NotSerializableException没有序列化的异常 public class NotSerializableException抛出一个实例需要一个Serializable接口。 Serializable接口也叫标记型接口 要进行序列化和反序列化的类必须实现Serializable接口,就会给类标记 当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记 有:就可以序列化和反序列化 没有,就会抛出上面的异常*/ /*static关键字:静态关键字 静态优先于非静态加载到内存中

JAXB-6 XML 应用案例

自闭症网瘾萝莉.ら 提交于 2020-02-14 00:15:29
JAXB-6 XML 应用案例 JAXB-6 XML 应用案例 1、创建 Java Bean Class 2、编写针对该 XML 文档的 XML 序列化与反序列化类 3、测试解析与序列化功能 JAXB-6 XML 应用案例 JAXB 直接操作 XML 文档,突出一个快捷!当然,也需要 XML 文档简洁明了。 假设要对如下的 XML 文档进行存取操作; < class id = " c001 " > < name > Class A </ name > < students > < student id = " F20200212001 " > < name > Student A </ name > < sex > man </ sex > </ student > < student id = " F20200212002 " > < name > Student B </ name > < sex > woman </ sex > </ student > </ students > </ class > 班级 <class> ,学生集合 <students> ,学生 <student> 1、创建 Java Bean Class 参考: 2 JAXB Annotation 注解 Student.java @XmlAccessorType ( value =

牛客网 序列化二叉树

♀尐吖头ヾ 提交于 2020-02-13 12:38:24
题目: 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 解题: /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ /* 算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。 依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。 另外,结点之间的数值用逗号隔开。 */ public class Solution { int index = -1; //计数变量 String Serialize(TreeNode root) { StringBuilder sb =