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())

 

posted @ 2021-01-28 09:08  州长在手  阅读(335)  评论(1编辑  收藏  举报