序列化

Serializable:明明就一个空接口!为什么还要实现它?

谁都会走 提交于 2020-02-28 03:01:04
目录 01、先来点理论 02、再来点实战 03、再来点注意事项 04、再来点干货 05、再来点甜点 06、再来点总结 对于 Java 的序列化,我一直停留在最浅显的认知上——把那个要序列化的类实现 Serializbale 接口就可以了。我不愿意做更深入的研究,因为会用就行了嘛。 但随着时间的推移,见到 Serializbale 的次数越来越多,我便对它产生了浓厚的兴趣。是时候花点时间研究研究了。 01、先来点理论 Java 序列化是 JDK 1.1 时引入的一组开创性的特性,用于将 Java 对象转换为字节数组,便于存储或传输。此后,仍然可以将字节数组转换回 Java 对象原有的状态。 序列化的思想是“冻结”对象状态,然后写到磁盘或者在网络中传输;反序列化的思想是“解冻”对象状态,重新获得可用的 Java 对象。 再来看看序列化 Serializbale 接口的定义: public interface Serializable { } 明明就一个空的接口嘛,竟然能够保证实现了它的“类的对象”被序列化和反序列化? 02、再来点实战 在回答上述问题之前,我们先来创建一个类(只有两个字段,和对应的 getter/setter ),用于序列化和反序列化。 class Wanger { private String name; private int age; public String

Java中的文件和流相关知识

主宰稳场 提交于 2020-02-27 18:57:42
1. File File类可以使用文件路径字符串来创建File实例,该文件路径可以是绝对路径或相对路径 File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件 public class FileNameFilterTest { public void main(String[] args) { File file = new File("."); String[] nameList = file.list(((dir, name) -> name.endsWith(".java") || new File(name).isDirectory())); for (String name : nameList) { System.out.println(name); } } } 1 2 3 4 5 6 7 8 9 10 2. 流(Stream) Stream是从起源(source)到接收(sink)的有序数据 按照流向分可以分为输入流和输出流 输入流:只能从中读取数据,不能写入数据(基类是InputStream和Reader) 输出流:只能向其中写入数据,不能读取数据(基类是OutputStream和Writer) 按照操作的数据单元分为字节流和字符流 字节流:操作的数据单元是8位的字节

JAVA 打印流与转换流

筅森魡賤 提交于 2020-02-27 18:56:31
转换流 主要有两个 InputStreamReader 和 OutputStreamWriter 1. InputStreamReader 主要是将字节流输入流转换成字符输入流 2. OutputStreamWriter 主要是将字节流输出流转换成字符输出流 打印流主要包含两个:PrintStream 和 PrintWriter,分别对应字节流和字符流 完成屏幕打印的重定向 System.out 对应的就是 PrintStream , 默认在输出在控制台,我们可以重定向他的输出,可以定向到文件 也就是 执行 System.out.println("arry"); 不输出到屏幕,而输出到文件 /* System.in 可以接收屏幕的输入 */ import java.io.*; public class PrintStreamTest02{ public static void main(String[] args){ BufferedReader br = null; try{ InputStreamReader isr = new InputStreamReader(System.in); br = new BufferedReader(isr); String temp = null; while((temp = br.readLine()) != null){ System

RDD()——序列化问题

若如初见. 提交于 2020-02-27 13:22:21
在实际开发中我们往往需要自己定义一些对于 RDD的操作,那么此时需要考虑的主要问题是,初始化工作是在 Driver端进行的,而实际运行程序是在 Executor端进行的,这就涉及到了跨进程通信,是需要序列化的。 传递一个方法 import org.apache.spark.rdd.RDD class Search(query:String) { //过滤出包含字符串的数据 def isMatch(s: String): Boolean = { s.contains(query) } //过滤出包含字符串的RDD def getMatch1 (rdd: RDD[String]): RDD[String] = { rdd.filter(isMatch) } //过滤出包含字符串的RDD def getMatche2(rdd: RDD[String]): RDD[String] = { rdd.filter(x => x.contains(query)) } } 创建 Spark主程序 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object SeriTest { def main(args: Array[String]): Unit = { //1

C# xml序列化 二进制序列化 unity中的asset序列化

十年热恋 提交于 2020-02-27 09:31:33
序列化是将对象保存为xml或json或二进制文件; 反序列化则是读取文件信息,还原为对象; 先建一个存储数据的类,添加标签表示可序列化 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Xml.Serialization; [System.Serializable] public class XmlTest { [XmlAttribute("Id")] public int Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } [XmlElement("List")] public List<int> List { get; set; } } xml序列化和二进制序列化 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Xml.Serialization; using System.Runtime.Serialization.Formatters.Binary; public class

dubbo

隐身守侯 提交于 2020-02-27 07:27:07
什么是dubbo? dubbo是一个分布式服务框架,致力于提高性能和透明化远程RPC远程服务调用方案。 SOA服务治理方案(自行百度)。 dubbo能做什么? 透明化的远程方法调用。 软负载均衡及容错机制。 服务自动注册于发现,注册中心基于接口名查询服务提供者ip。 dubbo服务之间通讯协议有哪些? 第一:dubbo协议 dubbo缺省协议采用单一长连接合NIO异步通讯,适合于小数据量大并发的服务调用。 第二:rmi协议 java标准的远程调用协议 连接个数:多个连接 连接方式:短连接 传输协议:tcp 传输方式:同步 序列化:java标准二进制序列化 范围:传入传出参数数据大小包混合,消费者与提供者个数相近,可传文件。 采用jdk标准的java.rml实现,采用阻塞短连接合jdk标准序列化范式 commons-collections3 与commons-collections4存在反序列化风险 如果接口继承了java.rmi.remote接口,可以与原生的RMI互操作 如果没有继承会自动生成一个remote接口并继承java.rmi.remot 如果再spring设置中定义的了就会走spring的rmiLnvocationHandler接口 第三:hessian协议 基于hessian远程调用协议 连接个数:多个连接 连接方式:短连接 传输协议:http协议 传输方式:同步

序列化与反序列化的单例模式实现

ε祈祈猫儿з 提交于 2020-02-27 05:40:43
静态内置类可以达到线程安全的问题,但如果遇到序列化对象时,使用默认的方式运行得到的结果还是多例的。 import java.io.Serializable; public class MyObject implements Serializable { private static final long serialVersionUID = 888L; private static class MyObjectHandler{ private static final MyObject myObject = new MyObject(); } public MyObject() { } public static MyObject getInstance(){ return MyObjectHandler.myObject; } protected Object readResolve(){ System.out.println("调用了readResolve方法!"); return MyObjectHandler.myObject; } } import java.io.*; public class SaveAndRead { public static void main(String[] args) { try { MyObject myObject = MyObject

0121 spring-boot-redis的使用

牧云@^-^@ 提交于 2020-02-27 03:42:01
redis是什么呢? redis,属于NoSQL的一种,在互联网时代,起到加速系统的作用。 redis是一种内存数据库,支持7种数据类型的存储,性能1S 10w次读写; redis提供的简单的事务保证了高并发场景下数的一致性。 redis在2.6版本之后增加了lua支持,命令是原子性的; 本篇文章主要基于springboot的redis-starter。<br /> HELLO, 性能利器Redis. spring-boot-starter-redis 这个是springboot提供的redis操作工具包,底层的redis驱动使用的是lettus,而不是jedis; 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 序列化 主要通过 RedisTemplate 来操作redis;<br /> 当然也支持自定义序列化器,比如效率比较高的kyto序列化器; StringRedisTemplate :key,value都是按照字符串存储的。 TypedTuple 保存集合中的有序元素; 可以查看一下 StringRedisTemplate的源码: public

剑指offer 61~67

别说谁变了你拦得住时间么 提交于 2020-02-26 22:15:52
61.请实现两个函数,分别用来序列化和反序列化二叉树 public class Solution { String Serialize ( TreeNode root ) { if ( root == null ) return "#" ; return root . val + "," + Serialize ( root . left ) + "," + Serialize ( root . right ) ; } int index = - 1 ; TreeNode Deserialize ( String str ) { if ( str == null ) return null ; String [ ] s = str . split ( "," ) ; return Deserialize ( s ) ; } TreeNode Deserialize ( String [ ] str ) { index ++ ; if ( ! str [ index ] . equals ( "#" ) ) { TreeNode node = new TreeNode ( Integer . parseInt ( str [ index ] ) ) ; node . left = Deserialize ( str ) ; node . right = Deserialize (

使用静态内置类实现单例模式

走远了吗. 提交于 2020-02-26 21:32:54
使用静态内置类同样可以达到线程安全的目的。 public class MyObject { private static class MyObjectHandler{ private static MyObject myObject = new MyObject(); } public MyObject() { } public static MyObject getInstance(){ return MyObjectHandler.myObject; } } public class MyThread extends Thread{ @Override public void run() { System.out.println(MyObject.getInstance().hashCode()); } } public class Run { public static void main(String[] args) { MyThread myThread0 = new MyThread(); MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread0.start(); myThread1.start(); myThread2.start(); } } 下一节: