protolator - Protobuf <==> json
github.com/hyperledger/fabric-config/protolator 是 Hyperledger Fabric 中的一个 Go 包,用于将 Protocol Buffers(ProtoBuf)消息和 JSON 格式之间进行转换。它提供了一种方便的方式来将 Fabric 配置文件(以 ProtoBuf 格式表示)与 JSON 配置文件之间进行相互转换。这对于 Fabric 的配置管理和部署非常有用,使得用户可以轻松地在不同的配置格式之间进行切换。
功能和用法
protolator 提供了一组功能,用于在 ProtoBuf 格式和 JSON 格式之间进行转换:
DeepMarshalJSON
func DeepMarshalJSON(m proto.Message) ([]byte, error)
- 该方法用于将给定的 ProtoBuf 消息
m转换为 JSON 格式的字节流。 - 它递归地将 ProtoBuf 的消息及其子消息转换为 JSON 格式,返回表示 JSON 格式数据的字节流。
- 注意:转换后的 JSON 字节流将具有缩进格式,易于阅读。
DeepUnmarshalJSON
func DeepUnmarshalJSON(data []byte, m proto.Message) error
- 该方法用于将给定的 JSON 格式字节流
data转换为指定的 ProtoBuf 消息m。 - 它递归地将 JSON 格式的数据解析并填充到
m中,返回 nil 或错误。 - 注意:JSON 字节流必须是有效的,并且与目标消息
m的结构相匹配。
Nested
type Nested struct{...}
Nested类型是用于 ProtoBuf 和 JSON 之间可嵌套转换的通用转换器。- 它提供了
Marshal和Unmarshal方法,用于将 ProtoBuf 格式的消息转换为可嵌套的 JSON 格式,以及将可嵌套的 JSON 格式转换为 ProtoBuf 格式。
使用示例
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-config/protolator"
"encoding/json"
)
// 使用 proto 文件定义的 message 结构
// 假设定义了 proto 文件如下:
// message MyData {
// string name = 1;
// int32 age = 2;
// }
type MyData struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Age int32 `protobuf:"varint,2,opt,name=age" json:"age,omitempty"`
}
func main() {
// 创建一个 MyData 实例
data := &MyData{
Name: "John",
Age: 30,
}
// 使用 DeepMarshalJSON 将 ProtoBuf 数据转换为 JSON 字节流
jsonData, err := protolator.DeepMarshalJSON(data)
if err != nil {
fmt.Println("Error marshaling to JSON:", err)
return
}
// 使用 DeepUnmarshalJSON 将 JSON 字节流转换为 ProtoBuf 数据
newData := &MyData{}
err = protolator.DeepUnmarshalJSON(jsonData, newData)
if err != nil {
fmt.Println("Error unmarshaling from JSON:", err)
return
}
// 输出结果
fmt.Println("Original data:", data)
fmt.Println("JSON data:", string(jsonData))
fmt.Println("Unmarshaled data:", newData)
}
在上述示例中,我们使用 github.com/hyperledger/fabric-config/protolator 的 DeepMarshalJSON 方法将 MyData 结构体从 ProtoBuf 格式转换为 JSON 格式的字节流,并使用 DeepUnmarshalJSON 方法将 JSON 字节流再转换回 ProtoBuf 格式的数据。输出结果显示了原始数据、转换后的 JSON 数据以及再次转换回来后的数据。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
protolator - Protobuf <==> json的更多相关文章
- protobuf json xml比较
1 protobuf/xml/json对比 从数据的存储格式的角度进行对比 假如要存储一个键值对: {price:150} 1.1 protobuf的表示方式 message Test { opti ...
- golang gob 有什么优势? gob/protobuf/json/xml 效率对比,benchmark 压力测试
TODO 待研究: https://blog.csdn.net/love_se/article/details/7941876 https://blog.csdn.net/wangshubo1989/ ...
- Redis JdkSerializationRedisSerializer,stringRedisSerializer,ProtoBuf 体积,性能简单比较.
/** * User: laizhenwei * Date: 2018-04-10 Time: 14:17 * Description: */ @RunWith(SpringRunner.class) ...
- 让SpringBoot的jackson支持JavaBean嵌套的protobuf
问题背景 REST 项目使用protobuf 来加速项目开发,定义了很多model,vo,最终返回的仍然是JSON. 项目中一般使用 一个Response类, public class Respons ...
- protobuf 协议浅析
目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...
- 《OD学Flume》20160806Flume和Kafka
一.Flume http://flume.apache.org/FlumeUserGuide.html Flume是一个分布式的,可靠的,可用的,非常有效率的对大数据量的日志数据进行收集.聚集.移动信 ...
- iOS 让CoreData更简单些
原文:http://www.cocoachina.com/ios/20170421/19096.html 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而 ...
- 谁能用通俗的语言解释一下什么是 RPC 框架?
转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题 关于RPC你的题目是RPC框架,首先了解什么叫RP ...
- .net core高性能通讯开源组件BeetleX
BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...
- (译)xDS REST and gRPC protocol
xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和 ...
随机推荐
- [OpenCV-Python] 21 OpenCV 中的轮廓
文章目录 OpenCV-Python:IV OpenCV中的图像处理 21 OpenCV 中的轮廓 21.1 初识轮廓 21.1.1 什么是轮廓 21.1.2 怎样绘制轮廓 21.1.3 轮廓的近似方 ...
- 一天吃透Redis面试八股文
Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...
- 解决VM虚拟机中IP或域名不能ping通
c4548abb-da65-4f7d-827f-e95dca25a13d 问题 无法ping通域名, 检查事项 确定在同一个子网,能访问DNS服务器. DNS服务器正确设置了正反向解析,且DNS服务器 ...
- 基于SqlSugar的开发框架循序渐进介绍(29)-- 快速构建系统参数管理界面-Vue3+ElementPlus
在随笔<基于SqlSugar的开发框架循序渐进介绍(28)-- 快速构建系统参数管理界面>中介绍了基于SqlSugar开发框架,构建系统参数管理的后端API部分,以及WInform界面部分 ...
- 音视频八股文(10)-- mp4结构
介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 .它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流.海报.字幕和元数据等.(顺便⼀提,⽬前流⾏的视频编码格 ...
- #Powerbi 季度时间进度计算
上一篇我们学习了月度时间进度的计算方法,今天我们学习季度时间进度的测算. 思路:找出目前共计消耗了多少天(季度),目前日期所在的季度共有多少天,两者相除即是季度的时间进度 首先列出DAX函数: 本 ...
- Wolai 使用教程:嵌入小组件库,打造精美、强大的知识库主页
Wolai /我来云笔记在 2022.7.11 日的更新中,支持嵌入包括 NotionPet.芦笋.Replit 等在内的第三方应用.感谢 Wolai 云笔记官方对于 NotionPet 的支持. 趁 ...
- Django-2:创建项目Project
命令:django-admin startproject mysite PS C:\Users\liujun> cd e:\pyapp\cmdbPS E:\pyapp\cmdb> djan ...
- JAVA 使用IText7 + Freemarker 动态数据生成PDF实现案例
技术方案:IText7 + Freemarker 技术文档 Itext 官网:https://itextpdf.com/ itext API文档:https://api.itextpdf.com/iT ...
- 前端仿今日头条、网易新闻 tabs组件,根据文字多少自适应tab项宽度,支持自定义标题栏
快速实现 前端仿今日头条网易新闻 tabs 组件标签页,根据文字多少自适应 tab项宽度, 详情请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id ...