基于protobuf2.6序列化 反序列化

代码:  protobuf26_serialize_deserialize

序列化、反序列化工具类:

package org.cgl.util.protobuf26;

import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.TextFormat;
import org.cgl.util.protobuf26.message.Message;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by agui on 3/14/2017.
 */
public class ProtoBufUtil {
    public static String shortDebugString(GeneratedMessage gmsg){
        return null == gmsg? "空": TextFormat.shortDebugString( gmsg);
    }

    public static String to_binaray(GeneratedMessage.Builder builder) throws IOException {
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        bs.write(builder.build().toByteArray());
        return bs.toString(Name.ISO_8859_1);
    }
    public static String to_binaray(GeneratedMessage msg_obj) throws IOException {
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        bs.write(msg_obj.toByteArray());
        String msg_bin = bs.toString(Name.ISO_8859_1);
        return msg_bin ;
    }

    //String msg_bin...
    //TrmRtrDvcAgtSvGgPrtbf.Cmd cmd_default_to_net_g = TrmRtrDvcAgtSvGgPrtbf.Cmd.parseFrom(msg_bin.getBytes("iso-8859-1"))
    public static GeneratedMessage to_object(Class  msg_clz, String msg_bin) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        byte[] msg_bin0 = msg_bin.getBytes(Name.ISO_8859_1);
        Method parseFrom_method = msg_clz.getMethod("parseFrom",byte[].class);
        Object msg_obj = parseFrom_method.invoke(null, msg_bin0);
        return (GeneratedMessage) msg_obj;
    }

    public static void main(String[] args) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        /**
         * 将 req 序列化为 req_bin_string ,  再将 req_bin_string 反序列化为 req_object_from_bin_string
         */
        Message.LoginRequest req = Message.LoginRequest.newBuilder().setApplicationId(10).setUserName("zhangsan").setPasswordMd5("aaaaaaaaaaaaaaaaaaaa").build();
        String message = null;
        String req_bin_string = to_binaray(req);
        Message.LoginRequest req_object_from_bin_string = (Message.LoginRequest) to_object(Message.LoginRequest.class, req_bin_string);

        //req_object_from_bin_string 和 req 一样的
        int debug = 0;

    }
}

  命令(常量)类:

package org.cgl.util.protobuf26;

/**
 * Created by agui on 4/22/2017.
 */
public class Name {
    public static final String ISO_8859_1 = "ISO-8859-1";
}

  

protobuf报文定义:

option java_package = "org.cgl.util.protobuf26.message";
option java_outer_classname = "Message";

message LoginRequest{
  optional int32 applicationId = 1;
  optional string userName = 2;
  optional string passwordMd5 = 3;
}

  

生成报文解析器命令:

protoc message.proto  --java_out=.

  

时间: 2024-10-05 05:05:44

基于protobuf2.6序列化 反序列化的相关文章

protostuff序列化/反序列化

Protostuff是基于Google protobuff技术的Java版本,直接使用原生的protobuff是需要数据结构的预编译过程,需要编写.proto格式的配置文件,再通过protobuff提供的工具翻译成目标语言代码,而Protostuff动态支持了protobuff的预编译的过程,可以直接使用普通java POJO进行序列化,简化编码. 经过实测序列化性能相对原生protpbuff没有影响. 由于Protostuff只支持Java实现,不过并未对序列化格式有做任何修改,所以Proto

.NET序列化反序列化总结

一直想写这个专题,但是工作后人很懒散,总下不了决心,今天一个人在家就写下来. 关于序列化,可以总结出它的作用有以下几点: 1.记录应用程序的状态,在下次启动时还原上次的状态. 2.进程之间的通信,如使用socket编程时使用.这里的进程包括同一台主机之间进程的通信,也包括不同主机之间的通信. 3.作为对象的深拷贝的一种实现方式. .net中的序列化支持下面几种序列化机制: 1.使可序列化的类型序列化和反序列化 2.控制可序列化的类型的序列化/反序列化内容和过程 3.将类型序列化/反序列化为不同的

序列化反序列化的一些可用种类

1.java自带的 2.kryo 3.FST 4.protostuff protobuf的一个缺点是需要数据结构的预编译过程,首先要编写.proto格式的配置文件,再通过protobuf提供的工具生成各种语言响应的代码.由于java具有反射和动态代码生成的能力,这个预编译过程不是必须的,可以在代码执行时来实现.有个protostuff(http://code.google.com/p/protostuff/)已经实现了这个功能. protostuff基于Google protobuf,但是提供了

springboot学习(三)——http序列化/反序列化之HttpMessageConverter

以下内容,如有问题,烦请指出,谢谢! 上一篇说掉了点内容,这里补上,那就是springmvc的http的序列化/反序列化,这里简单说下如何在springboot中使用这个功能. 使用过原生netty http的人可能对http序列化比较熟悉,springmvc中的意思跟netty中的意思一样.http序列化(或者叫作http报文编码),就是将Java类转化为二进制流输出给http body:http反序列化,就是将http报文转换为程序内部的Java类.有了http反序列化,就不用再去一个个re

基于protostuff的序列化工具类开发

[toc] 基于protostuff的序列化工具类开发 前言 前面在介绍protostuff的基本使用时(可以参考文章protostuff基本使用),都是针对某个类写的序列化和反序列化方法,显然这样不具有通用性,例如在进行远程过程调用时,传输的对象并不唯一,这时就需要开发具有通用性的序列化工具类,即不管序列化的对象是什么类型,都可以使用该工具类进行序列化.下面就来开发这样的工具类. 基于这个需要,下面会开发两个序列化工具类,一个是不具有缓存功能的SerializationUtil,一个是具有缓存

序列化反序列化

对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- 1 package utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.O

.net 序列化反序列化

.net 序列化创建对象的深拷贝 public static object DeepClone(object original) { using (MemoryStream stream = new MemoryStream()) { //构造序列化格式化器来执行所有实习工作 BinaryFormatter formatter = new BinaryFormatter(); //流上下文 formatter.Context = new StreamingContext(StreamingCon

常用json序列化/反序列化技术对比测试

目前常用的json工具有:1.json-lib:2.jakson-mapper:3.fastjson. 下面对这三种工具的性能进行简单对比测试. 测试样本:一个126K的json文件,内容为json数组. 测试方法:反序列化,读取文件中的json转化为java对象. 测试代码如下: 1 @Test 2 public void testDeserialize() throws Exception { 3 String dealer = "d:\\auto\\json\\100016109.js&q

10.8-全栈Java笔记:序列化/反序列化的步骤和实例

本节我们详细讲解10.3节中提到的序列化和反序列化操作. 序列化和反序列化是什么 当两个进程远程通信时,彼此可以发送各种类型的数据. 无论是何种类型的数据,都会以二进制序列的形式在网络上传送.比如,我们可以通过http协议发送字符串信息:我们也可以在网络上直接发送JAVA对象.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再恢复为Java对象. 把Java对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为Java对象的过程称为对象的反序列化. 对象序