java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用

最近由于工作需要,需要研究常用的集中序列化方式,主要目的是对象序列化后占用空间会大大减少,便于存储和传输,下面是几种序列化方式的使用demo

1. Java自带的Serialize

依赖jar包:无

代码示意:

import java.io.{ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream}

object JavaSerialize {

def serialize(obj: Object): Array[Byte] = {

var oos: ObjectOutputStream = null

var baos: ByteArrayOutputStream = null

try {

baos = new ByteArrayOutputStream()

oos = new ObjectOutputStream(baos)

oos.writeObject(obj)

baos.toByteArray()

}catch {

case e: Exception =>

println(e.getLocalizedMessage + e.getStackTraceString)

null

}

}

def deserialize(bytes: Array[Byte]): Object = {

var bais: ByteArrayInputStream = null

try {

bais = new ByteArrayInputStream(bytes)

val ois = new ObjectInputStream(bais)

ois.readObject()

}catch {

case e: Exception =>

println(e.getLocalizedMessage + e.getStackTraceString)

null

}

}

}

2. Jackson序列化方式

依赖jar包:json4s-jackson_2.10-3.2.11.jar、jackson-annotations-2.3.0.jar、jackson-core-2.3.1.jar、jackson-databind-2.3.1.jar(均可在maven上下载)

代码示意:

import org.json4s.NoTypeHints

import org.json4s.jackson.Serialization

import org.json4s.jackson.Serialization._

object JacksonSerialize {

def serialize[T <: serializable with anyref : manifest t string="{</p">

implicit val formats = Serialization.formats(NoTypeHints)

write(obj)

}

def deserialize[T: Manifest](objStr: String): T = {

implicit val formats = Serialization.formats(NoTypeHints)

read[T](objStr)

}

}

代码也是非常简单,好处是序列化后的结果是以json格式显示,可以直接阅读,更人性化,但是缺点是序列化耗时较久,并且序列化后大小也不小

3. Avro序列化方式

依赖jar包:avro-tools-1.7.7.jar(用于编译生成类)、avro-1.7.7.jar

第一步:定义数据结构scheme文件user.avsc,如下:

{"namespace": "example.avro",

"type": "record",

"name": "User",

"fields": [

{"name": "name", "type": "string"},

{"name": "favorite_number", "type": ["int", "null"]},

{"name": "favorite_color", "type": ["string", "null"]}

]

}

第二步:通过工具生成类

(1)将avro-tools-1.7.7.jar 包和user.avsc 放置在同一个路径下

(2)执行 java -jar avro-tools-1.7.7.jar compile schema user.avsc java.

(3)会在当前目录下,自动生成User.java文件,然后在代码中引用此类

第三步:代码示意

import java.io.ByteArrayOutputStream

import example.avro.User

import org.apache.avro.file.{DataFileReader, DataFileWriter}

import org.apache.avro.io.{DecoderFactory, EncoderFactory}

import org.apache.avro.specific.{SpecificDatumReader, SpecificDatumWriter}

object AvroSerialize {

//将序列化的结果返回为字节数组

def serialize(user: User): Array[Byte] ={

val bos = new ByteArrayOutpu

a699

tStream()

val writer = new SpecificDatumWriter[User](User.getClassSchema)

val encoder = EncoderFactory.get().binaryEncoder(bos, null)

writer.write(user, encoder)

encoder.flush()

bos.close()

bos.toByteArray

}

//将序列化后的字节数组反序列化为对象

def deserialize(bytes: Array[Byte]): Any = {

val reader = new SpecificDatumReader[User](User.getClassSchema)

val decoder = DecoderFactory.get().binaryDecoder(bytes, null)

var user: User = null

user = reader.read(null, decoder)

user

}

//将序列化的结果存入到文件

def serialize(user: User, path: String): Unit ={

val userDatumWriter = new SpecificDatumWriter[User](User.getClassSchema)

val dataFileWriter = new DataFileWriter[User](userDatumWriter)

dataFileWriter.create(user.getSchema(), new java.io.File(path))

dataFileWriter.append(user)

dataFileWriter.close()

}

//从文件中反序列化为对象

def deserialize(path: String): List[User] = {

val reader = new SpecificDatumReader[User](User.getClassSchema)

val dataFileReader = new DataFileReader[User](new java.io.File(path), reader)

var users: List[User] = List[User]()

while (dataFileReader.hasNext()) {

users :+= dataFileReader.next()

}

users

}

}这里提供了两种方式,一种是通过二进制,另一种是通过文件。方法相对上面两种有点复杂,在hadoop RPC中使用了这种序列化方式

4. Kryo序列化方式

依赖jar包:kryo-4.0.0.jar、minlog-1.2.jar、objenesis-2.6.jar、commons-codec-1.8.jar

代码示意:

import java.io.{ByteArrayOutputStream}

import com.esotericsoftware.kryo.{Kryo}

import com.esotericsoftware.kryo.io.{Input, Output}

import com.esotericsoftware.kryo.serializers.JavaSerializer

import org.objenesis.strategy.StdInstantiatorStrategy

object KryoSerialize {

val kryo = new ThreadLocal[Kryo]() {

override def initialValue(): Kryo = {

val kryoInstance = new Kryo()

kryoInstance.setReferences(false)

kryoInstance.setRegistrationRequired(false)

kryoInstance.setInstantiatorStrategy(new StdInstantiatorStrategy())

kryoInstance.register(classOf[Serializable], new JavaSerializer())

kryoInstance

}

}

def serialize[T <: serializable with anyref : manifest t array>

val baos = new ByteArrayOutputStream()

val output = new Output(baos)

output.clear()

try {

kryo.get().writeClassAndObject(output, t)

} catch {

case e: Exception =>

e.printStackTrace()

} finally {

}

output.toBytes

}

def deserialize[T <: serializable with anyref : manifest array t="{</p">

val input = new Input()

try {

input.setBuffer(bytes)

kryo.get().readClassAndObject(input).asInstanceOf[T]

} finally {

}

}

}这种方式经过我本地测试,速度是最快的,关键是做好对kryo对象的复用,因为大量创建会非常耗时,在这里要处理好多线程情况下对kryo对象的使用,spark中也会使用到kryo

其实还有其他的序列化方式,比如protobuf、thrify,操作上也有一定复杂性,由于环境问题暂时未搞定,搞定了再发出来。

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

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

相关文章

Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样

分享一个利用反射实现比较两个实体属性值的方法&#xff1a;package net.zwq1105.test;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.sql.Timestamp;import java.util.ArrayList;import java.util.Array…

java编码规范右大括号换行_java编码规范摘选

1.方法注释模板;description&#xff0c;param&#xff0c;author可选&#xff1a;return&#xff0c;exception2. 行尾注释&#xff0c;如循环结束&#xff0c;模块类结束行3. 文件开头注释项目名称project n ame创建日期&#xff1a;{date}修改历史&#xff1a;版权声明&…

python widnows mysql_Windows下python安装MySQLdb

安装MySQLdb需要在电脑上安装MySQL connector C&#xff0c;只需要这个connector就好&#xff0c;不需要把mysql装全。另外&#xff0c;需要安装VC for python提供编译。到官网上下载脚本进行安装即可&#xff0c;解压压缩包以后&#xff0c;cmd到目标目录&#xff0c;python s…

centos6 yum安装mysql5.6_centos 6.5 yum安装mysql 5.6

[rootlocalhost ~]# vim /etc/yum.repos.d/mysql.repo 新建mysql的yum文件[mysql56-community]nameMySQL 5.6 Community Serverbaseurlhttp://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/gpgcheck0wq保存退出&#xff01;[rootlocalhost ~]# yum repolist enable…

java 中断代码_你的java代码可中断吗?(2)

1.确保提交到线程池的任务可中断原文&#xff1a;www.securecoding.cert.org&#xff0c;TPS02-J. Ensure thattasks submitted to a thread pool are interruptible。为了能完全关闭线程池或者取消线程池中的个别任务&#xff0c;程序应提交支持使用Thread.interrupt()中断的任…

php session 封装类,PHP封装的数据库保存session功能类

本文实例讲述了PHP封装的数据库保存session功能类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHP用数据库保存session类&#xff1a;class SafeSessionHandler implements SessionHandlerInterface {public $save_path;public $session_name;public $table;public…

apache php mysql配置详解,详细介绍:Apache+PHP+MySQL配置攻略_php基础

一、系统要求&#xff1a;本系统在REDHAT7.2版本测试通过二、服务器端软件要求&#xff1a;1:到APACHE的网络站下载APACHE WEB SERVER http://www.apache.org/2. 到php的网络站下载php解析器 http://www.php.net/三&#xff0e;安装调试WEB SERVER把以上各文件下载后放到同一个…

php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

《script》ec(2);《script》php 常用的排序算法代码[冒泡,递归排序冒泡排序算法function bubblesort($arr){$ncount($arr);for($i0;$i{for($j$i;$j<$n-1;$j){if($arr[$i]>$arr[$j]){$temp$arr[$i];$arr[$i]$arr[$j];$arr[$j]$temp;}}}return $arr;}//直接插入排序functio…

php dos,防止用户利用PHP代码DOS造成用光网络带宽

用PHP代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:$packets 0;$ip $_GET[\ip\];$rand $_GET[\port\];set_time_limit(0);ignore_user_abort(FALSE);$exec_time $_GET[\time\];$time time();print \"Flooded: $ip on port $rand\";$max_time $t…

java中wait的场景,wait——webdriver实用指南java版

场景Wait类的使用场景是在页面上进行某些操作&#xff0c;然后页面上就会出现或隐藏一些元素&#xff0c;此时使用WebDriverWait类的until方法来等待这些效果完成以便进行后续的操作。另外页面加载时有可能会执行一些ajax&#xff0c;这时候也需要去WebDriverWait的until的等待…

php使用未定义常数,php-使用未定义的常量SIGTERM-gt;假定为’SIGTERM’

当前在Windows机器上运行带有Codeception的PHPUnit会给我一个错误&#xff1a;[PHPUnit_Framework_Exception]Use of undefined constant SIGTERM –assumed ‘SIGTERM’据我所知,SIGTERM是PCNTL提供的常数,Windows不支持.这样,该常数就不能用于Windows env上运行的测试.完全没…

仿58 php框架源码,转转最新源码

压缩包 : bc03626411ac7cfc4065d9.rar 列表detail1/address.phpdetail1/index.phpdetail1/index1.phpdetail1/login.phpdetail1/order.phpdetail1/payment_number.phpdetail1/style/css/jquery.mloading.cssdetail1/style/css/style.cssdetail1/style/css/touchTouch.cssdetail…

mysql的发展进程和特点,试述数据库技术的发展过程。数据库技术发展的特点是什么?...

试述数据库技术的发展过程。数据库技术发展的特点是什么&#xff1f;更多相关问题如果冬季涂料施工时涂料不易干&#xff0c;应多加一些催干剂。THE ANCHOR WAS HEAVED AWEIGH means ______.A.The anchor was weightedB.The anchor was let goA schooner is a fore&#xff0d;…

java arraylist char,Java基础学习笔记六 Java基础语法之类和ArrayList详解

引用数据类型引用数据类型分类&#xff0c;提到引用数据类型(类)&#xff0c;其实我们对它并不陌生&#xff0c;如使用过的Scanner类、Random类。我们可以把类的类型为两种&#xff1a;第一种&#xff0c;Java为我们提供好的类&#xff0c;如Scanner类&#xff0c;Random类等&a…

基音检测 matlab,基于MATLAB基音检测分析.doc

基于MATLAB基音检测分析基于MATLAB基音检测分析摘要&#xff1a;基音检测作为语音信号处理的重要手段&#xff0c;被广泛地应用于语音的合成、编码及识别等一系列语音信号处理技术问题。基音检测的准确性对于要求极高的语音识别、合成、分析、压缩编码等等都有重要的意义。该文…

php多线程 static变量,private static和public static的比较:多线程间

private static和public static的比较&#xff0c;区别在于修改的范围不同&#xff0c;但作用域都是全局的即整个进程内共享&#xff0c;与具体线程无关。以下是测试代码&#xff1a;声明静态内部变量的抽象类package atest.privateStatic;public abstract class TypeObject {p…

matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...

主题&#xff1a;高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍会场流程&#xff1a;13:30--14:00&#xff1a;参会嘉宾到场签名14:00--14:45&#xff1a;期权知识14:45--15:25&#xff1a;期权交易策略使用15:25--15:35&#xff1a;茶歇15:35--16:35&#…

nginx怎么升级php的版本号,nginx 升级指南,最详细的nginx升级步骤

查看nginx当前版本通过nginx -V 命令就可以查看当前的版本&#xff0c;已经当前版本安装时候的一些nginx命令[rootlocalhost sbin]# ./nginx -Vnginx version: nginx/1.2.9built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)configure arguments: --prefix/nginx_instal1.下…

oracle sum函数返回类型,Oracle / PLSQL SUM函数

这个Oracle教程解释了如何使用Oracle / PLSQL SUM函数。SUM(x) 添加x中的所有值&#xff0c;并返回总和。SUM函数对一组行进行操作&#xff0c;并返回一行输出。 Null值被SUM函数忽略。您可以使用DISTINCT关键字排除重复条目。语法Oracle / PLSQL SUM函数的语法是&#xff1a;S…

pdo oracle返回参数游标,PDOStatement::closeCursor

PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标&#xff0c;使语句能再次被执行。(PHP 5 > 5.1.0, PECL pdo > 0.9.0)说明语法bool PDOStatement::closeCursor ( void )PDOStatement::closeCursor() 释放到数据库服务的连接&#xff0c;以便发出其他 S…