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
}
原文地址:https://www.cnblogs.com/brady-wang/p/14442598.html