怎么推广网站,wordpress upload,装修公司起名字大全免费,网站建设推广哪里实惠最近由于工作需要#xff0c;需要研究常用的集中序列化方式#xff0c;主要目的是对象序列化后占用空间会大大减少#xff0c;便于存储和传输#xff0c;下面是几种序列化方式的使用demo1. Java自带的Serialize依赖jar包#xff1a;无代码示意#xff1a;import java.io.…最近由于工作需要需要研究常用的集中序列化方式主要目的是对象序列化后占用空间会大大减少便于存储和传输下面是几种序列化方式的使用demo1. Java自带的Serialize依赖jar包无代码示意import java.io.{ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream}object JavaSerialize {def serialize(obj: Object): Array[Byte] {var oos: ObjectOutputStream nullvar baos: ByteArrayOutputStream nulltry {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 nulltry {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.NoTypeHintsimport org.json4s.jackson.Serializationimport org.json4s.jackson.Serialization._object JacksonSerialize {def serialize[T : serializable with anyref : manifest t string{/pimplicit 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.ByteArrayOutputStreamimport example.avro.Userimport 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 ByteArrayOutpua699tStream()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 nulluser 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.JavaSerializerimport org.objenesis.strategy.StdInstantiatorStrategyobject 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 arrayval 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{/pval input new Input()try {input.setBuffer(bytes)kryo.get().readClassAndObject(input).asInstanceOf[T]} finally {}}}这种方式经过我本地测试速度是最快的关键是做好对kryo对象的复用因为大量创建会非常耗时在这里要处理好多线程情况下对kryo对象的使用spark中也会使用到kryo其实还有其他的序列化方式比如protobuf、thrify操作上也有一定复杂性由于环境问题暂时未搞定搞定了再发出来。