protobuf序列化

package main

import (
	"fmt"
	"github.com/gogo/protobuf/jsonpb"
	"github.com/golang/protobuf/proto"
	"io/ioutil"
	"log"
	"test/src/first"
)


func main() {
	person := newPersonMessage()
	//fmt.Println(person.GetUsername())
	//_ = writeToFile("person.bin", person)

	//pm := first.PersonMessage{}
	//
	//_ = readFromFile("person.bin",&pm)

	fmt.Println(&person)

	jsonstr := toJson(person)
	fmt.Println(jsonstr)

	pm3 := first.PersonMessage{}
	_ = fromJson(jsonstr,&pm3)
	fmt.Println(&pm3)

}

func toJson(pm proto.Message)  string {
	marshaler := jsonpb.Marshaler{Indent: "    "}
	str,err := marshaler.MarshalToString(pm)
	if err != nil{
		log.Fatalln("转换失败")
	}

	return str

}

func fromJson(in string,pb proto.Message) error  {
	err := jsonpb.UnmarshalString(in,pb); if err!=nil{
		log.Fatalln("失败")
	}

	return nil
}

func readFromFile(filename string,pb proto.Message) error  {
	dateBytes,err := ioutil.ReadFile("./person.bin"); if err!=nil{
		log.Fatalln("读取失败")
	}

	err =proto.Unmarshal(dateBytes,pb)
	if err!=nil{
		log.Fatalln("序列化失败")
	}

	return nil
}


func writeToFile(filename string,pb proto.Message) error  {
	data,error := proto.Marshal(pb)
	if error !=nil{
		log.Fatalln("无法序列化到bytes")
	}

	if err := ioutil.WriteFile(filename,data,0644); err !=nil{
		log.Fatalln("无法写入到文件")
	}
	log.Println("写入成功")
	return nil
}

func newPersonMessage() * first.PersonMessage  {

	p := first.PersonMessage{
		Id:       1,
		Username: "hello",
	}
	return &p
}
posted @   brady-wang  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
历史上的今天:
2020-02-24 centOS7永久关闭防火墙(防火墙的基本使用(转)
2020-02-24 linux下composer安装
2020-02-24 CentOS7 linux下yum安装mysql5.7
2020-02-24 redis设置密码
点击右上角即可分享
微信分享提示