zoukankan      html  css  js  c++  java
  • Hyperledger Fabric 2.2.X 解析区块到json( parsing block )只需要两行代码

    package intermediately
    
    import (
    	"encoding/json"
    	"github.com/hyperledger/fabric-protos-go/common"
    	"github.com/hyperledger/fabric/common/tools/protolator"
    	"github.com/pkg/errors"
    )
    
    
    
    func EncodeProto( input *common.Block) ([]byte,error) {
    	tree ,err := protolator.RecursivelyCreateTreeFromMessage(input)
    	jsonByte,err :=json.Marshal(tree)
    	if err != nil {
    		return nil,errors.Wrapf(err, "error encoding output")
    	}
    	return jsonByte,nil
    }
    

     *common.Block 是2.2.x版本统一的 proto.Message,因此可以作为Message类型,解析为tree,之后使用json进行序列化就OK了

     https://gitee.com/mai12/glucia2a2a1      项目源码地址,golang sdk 大部分功能都写了例子,使用gin框架做的服务。

    什么找到不到RecursivelyCreateTreeFromMessage这个函数?忘记说关键点了,

    github.com/hyperledger/fabric@v2.1.1+incompatible/common/tools/protolator/json.go 的

    这个recursivelyCreateTreeFromMessage函数首字母大写就好了,编译报错就把剩下的文件也改了,或者自己封装一个首字母大写的函数暴露出去。

     -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    烟消云散大佬告诉我这样写不是最好的选择, golang中的io.Reader/Writer 可以在多种不同的io类型之间进行过渡和转化,不是我认为的文件操作,因此可以在不改动源码的情况下这样写

    func EncodeProto2( input *common.Block) ([]byte,error) {
    	var w = new(bytes.Buffer)
    	if err := protolator.DeepMarshalJSON(w,input) ; err != nil {
    		return nil,errors.Wrapf(err, "error encoding output")
    	}
    	return w.Bytes(),nil
    }
    

    看一下这个例子,更能加深对io的理解

    a := "Hello World!"
    buf := new(bytes.Buffer)
    buf.ReadFrom(strings.NewReader(a))
    fmt.Println(buf.Bytes())
    
  • 相关阅读:
    商业即生活,一些思考和感悟
    Unity中使用摇杆控制
    在家乡做什么生意比较好?且看雷家第一智囊的分析
    Android5.0之Toobar的使用
    Android5.0常用颜色属性说明
    hiho week 38 P1 : 二分·二分答案
    CCF模拟题 字符串匹配
    CCF模拟题 最优配餐
    CCF模拟题 相反数
    CCF模拟题 最优灌溉
  • 原文地址:https://www.cnblogs.com/Addoil/p/14337994.html
Copyright © 2011-2022 走看看