• go protobuf 编码与解码


    package main
    
    import (
    	"encoding/hex"
    	"fmt"
    	"github.com/golang/protobuf/proto"
    	"github.com/golang/protobuf/ptypes"
    	"github.com/golang/protobuf/ptypes/any"
    	"reflect"
    )
    import "./protos/protos_pb"
    
    func typeForName(name string) (reflect.Type, error) {
    	pt := proto.MessageType(name)
    	if pt == nil {
    		return nil, fmt.Errorf("unknown type: %q", name)
    	}
    	st := pt.Elem()
    
    	return st, nil
    }
    
    func main() {
    	test := &logon.SearchRequest{
    		Query:         "",
    		PageNumber:    222,
    		ResultPerPage: 111,
    		Corpus:        logon.SearchRequest_WEB,
    	}
    	dst, err := proto.Marshal(test)
    	if err != nil {
    		return
    	}
    	fmt.Println(dst)
    	fmt.Println(hex.EncodeToString(dst))
    
    	// 解析数据 -- 方式一
    	test1 := &logon.SearchRequest{}
    	proto.Unmarshal(dst, test1)
    	fmt.Printf("方式一 :unmarshaled message: %v
    ", test1)
    
    	// 方式二
    	name := "logon.SearchRequest"
    	pt := proto.MessageType(name)
    	a := reflect.New(pt.Elem()).Interface().(proto.Message)
    	proto.Unmarshal(dst, a)
    	fmt.Printf("方式二 :unmarshaled message: %v
    ", a)
    
    
    	// 方式三
    	var x ptypes.DynamicAny
    	var xa = &any.Any{TypeUrl:"./" + name,Value: dst}
    	if err := ptypes.UnmarshalAny(xa, &x); err != nil {
    		fmt.Println(err)
    		return;
    	}
    	fmt.Printf("方式三 :unmarshaled message: %v
    ", x.Message)
    
    	// 方式四
    	x2 := reflect.New(pt.Elem()).Interface().(proto.Message)
    	var xa2 = &any.Any{TypeUrl:"./"+name,Value: dst}
    	if err := ptypes.UnmarshalAny(xa2, x2); err != nil {
    		fmt.Println(err)
    		return;
    	}
    	fmt.Printf("方式四 :unmarshaled message: %v
    ", x2)
    }
    
    syntax = "proto3";
    
    package logon;
    
    message SearchRequest {
        string query = 1;
        int32 page_number = 2;
        int32 result_per_page = 3;
        enum Corpus {
            UNIVERSAL = 0;
            WEB = 1;
            IMAGES = 2;
            LOCAL = 3;
            NEWS = 4;
            PRODUCTS = 5;
            VIDEO = 6;
        }
        Corpus corpus = 4;
    }
    
    message SearchResponse {
        string response = 1;
    }
    

     

  • 相关阅读:
    redis删除指定前缀的缓存
    php生成N个不重复的随机数实例
    Redis数据持久化,安全
    MySQL LOAD DATA
    utf 8无bom和utf 8什么区别
    MySQL直接导出CSV文件,并解决中文乱码的问题
    php 中将完整的年月日时分秒的时间转换成 年月日的形式
    PHP如何根据数组中的键值进行排序
    PHP array_multisort—对多个数组或多维数组进行排序
    sql case 函数与详细说明
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/9968863.html
Copyright © 2020-2023  润新知