标签分类
技术文章
当前位置:主页 > 计算机编程 > java > Protostuff序列化和反序列化的使用浅析

Protostuff序列化和反序列化的使用详细说明

  • 发布时间:
  • 作者:码农之家原创
  • 点击:90

Protostuff序列化和反序列化的使用浅析

这篇文章主要知识点是关于Protostuff,序列化,反序列化,Protostuff序列化和反序列化的使用浅析,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

21天学通HTML+CSS+JavaScript Web开发
  • 类型:前端大小:104.9 MB格式:PDF出版:人民邮电出版社作者:劳拉 莱梅
立即下载
疯狂Java讲义
疯狂Java讲义影印第4版
  • 类型:Java编程大小:619 MB格式:PDF出版:电子工业出版社作者:李刚
立即下载

更多相关的学习资源可以参阅 程序设计电子书Java电子书、等栏目。

大家都知道protobuf好用,可是在网上找到的netty整合protobuf的文章都是千篇一律,自己编写proto文件然后使用工具转java文件用起来复杂麻烦,经过不懈努力终于找到了一个简单的方法希望大家喜欢。

google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

1.实战

1.maven依赖:

    <dependency>
      <groupId>io.protostuff</groupId>
      <artifactId>protostuff-core</artifactId>
      <version>1.4.0</version>
    </dependency>
    <dependency>
      <groupId>io.protostuff</groupId>
      <artifactId>protostuff-runtime</artifactId>
      <version>1.4.0</version>
    </dependency>

2.ProtoBufUtil工具类:ProtoBufUtil.java

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;
/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtil {
  public ProtoBufUtil() {
  }
  public static <T> byte[] serializer(T o) {
    Schema schema = RuntimeSchema.getSchema(o.getClass());
    return ProtobufIOUtil.toByteArray(o, schema, LinkedBuffer.allocate(256));
  }
  public static <T> T deserializer(byte[] bytes, Class<T> clazz) {
    T obj = null;
    try {
      obj = clazz.newInstance();
      Schema schema = RuntimeSchema.getSchema(obj.getClass());
      ProtostuffIOUtil.mergeFrom(bytes, obj, schema);
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return obj;
  }
}

3. bean类Student.java:  

import io.protostuff.Tag;
/**
 * Created by zhangzh on 2017/2/20.
 */
public class Student {
  @Tag(1)
  private String name;
  @Tag(2)
  private String studentNo;
  @Tag(3)
  private int age;
  @Tag(4)
  private String schoolName;
  // 关于@Tag,要么所有属性都有@Tag注解,要么都没有,不能一个类中只有部分属性有@Tag注解
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getStudentNo() {
    return studentNo;
  }
  public void setStudentNo(String studentNo) {
    this.studentNo = studentNo;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getSchoolName() {
    return schoolName;
  }
  public void setSchoolName(String schoolName) {
    this.schoolName = schoolName;
  }
  @Override
  public String toString() {
    return "Student{" +
        "name='" + name + '\'' +
        ", studentNo='" + studentNo + '\'' +
        ", age=" + age +
        ", schoolName='" + schoolName + '\'' +
        '}';
  }
}

3.test类ProtoBufUtilTest.java:  

import java.util.Arrays;
/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtilTest {
  public static void main(String[] args) {
    Student student = new Student();
    student.setName("lance");
    student.setAge(28);
    student.setStudentNo("2011070122");
    student.setSchoolName("BJUT");
    byte[] serializerResult = ProtoBufUtil.serializer(student);
    System.out.println("serializer result:" + Arrays.toString(serializerResult));
    Student deSerializerResult = ProtoBufUtil.deserializer(serializerResult,Student.class);
    System.out.println("deSerializerResult:" + deSerializerResult.toString());
  }
}

4.输出结果:  

serializer result:[10, 5, 108, 97, 110, 99, 101, 18, 10, 50, 48, 49, 49, 48, 55, 48, 49, 50, 50, 24, 28, 34, 4, 66, 74, 85, 84]
deSerializerResult:Student{name='lance', studentNo='2011070122', age=28, schoolName='BJUT'}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到儿童python编程入门书籍推、 vue项目中使用md5加密以及、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java异常与处理机制分析

下一篇:eclipse创建java项目的方法详解

展开 +

收起 -

学习笔记
网友NO.189318

内存中数据序列化实例

一、用途 我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。 二、json序列化 1、dumps序列化和loads反序列化 dumps把数据类型转换成字符串 import jsoninfo = { 'name': 'The Count of Monte Cristo', 'type': 'Movie'}data = json.dumps(info)print(data)print(type(data))# 输出{name: The Count of Monte Cristo, type: Movie}class 'str' loads把字符串转换成数据类型 import jsonget_info = json.loads(data)print(get_info['name'])print(get_info)print(type(get_info))#输出The Count of Monte Cristo{'name': 'The Count of Monte Cristo', 'type': 'Movie'}class 'dict' 2.dump序列化和load反序列化 dump把数据类型转换成字符串并存储在文件中 import jsoninfo = { 'name': 'The Count of Monte Cristo', 'type': 'Movie'}with open(test.txt, w, encoding=utf-8) as f: json.dump(info, f) # 第一个参数是内存中的数据对象,第二个参数是文件句柄#写入文件中的内容{name: The Count of Monte Cristo, type: Movie} load把文件打开从字符串转换成数据类型 import jsonwith open(test.txt, r, encoding=utf-8) as f: data_from_file = json.load(f)print(data_from_file['name'])print(data_from_file)print(type(data_from_file))#输出The Count of Monte Cristo{'name': 'The Count of Monte Cristo', 'type……

网友NO.131750

python中json序列化的详细分析

本篇文章给大家带来的内容是关于python中json序列化的详细分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 之所以写这个因为自己总是弄混了,容易弄错,记下来有事没事看看 序列化是指把变量从内存中变成可存储或传输的过程称之为序列化用(使用dump或者dumps),把变量内容从序列化的对象重新读到 内存里称之为反序列化(使用load或者loads) 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON 表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快, 而且可以直接在Web页面中读取,非常方便 JSON和Python内置的数据类型对应如下: dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file_Object。要把JSON反序列化为 Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file_Object中读取字符串并反序列化 实例 dumps序列化一个对象 data= { 广州市: { 番禺区: [南村镇, 大石镇, 榄核镇], 天河区: [广州塔, 中信广场, 天河又一城] } }s = json.dumps(data, sort_keys=True, indent=4, ensure_ascii=False) print(s) #dumps:序列化一个……

网友NO.584552

Java对象序列化操作详解

本文实例讲述了Java对象序列化操作。分享给大家供大家参考,具体如下: 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以 二进制序列 的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有 对象的闭包 。 概念 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。 用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 对象序列化 序列化API java.io.ObjectOutputStream 代表对象输出流,它的 writeObject(Object obj) 方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。 java.io.ObjectInputStream 代表对象输入流,它的 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 代码示例 import jav……

网友NO.216729

Java序列化与反序列化的实例分析讲解

序列化与反序列化 Java对象是有生命周期的,当生命周期结束它就会被回收,但是可以通过将其转换为字节序列永久保存下来或者通过网络传输给另一方。 把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。 Serializable接口 一个类实现java.io.Serializable接口就可以被序列化或者反序列化。实际上,Serializable接口中没有任何变量和方法,它只是一个标识。如果没有实现这个接口,在序列化或者反序列化时会抛出NotSerializableException异常。 下面是一个实现了Serializable接口的类以及它的序列化与反序列化过程。 public class SerialTest { public static void main(String[] args) { Test test = new Test(); test.setName("test"); // 序列化,存储对象到文本 ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("test")); oos.writeObject(test); } catch (IOException e) { e.printStackTrace(); } finally { try { if (oos != null) { oos.close(); } } catch (IOException e) { e.printStackTrace(); } } // 反序列化,从文本中取出对象 ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("test")); Test1 test1 = (Test1) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (ois != null) { ois.close(); } } catch (IOExc……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明