[gRPC] 4. gRPC - Serialize protobuf message
학습 목표
- protobuf message를 바이너리로 작성
- 위를 읽기
- protobuf message를 JSON으로 작성
- binary vs JSON
JSON으로 변환하는 함수
func ProtobufToJson(message proto.Message) ([]byte, error) {
marshaler := protojson.MarshalOptions{
UseEnumNumbers: false,
Indent: " ",
UseProtoNames: true,
}
return marshaler.Marshal(message)
}
func WriteProtobufToJSONFile(message proto.Message, filename string) error {
data, err := ProtobufToJson(message)
if err != nil {
return fmt.Errorf("cannot marshal proto message to json : %w", err)
}
err = os.WriteFile(filename, data, 0644)
if err != nil {
return fmt.Errorf("cannot write JSON data to file : %w", err)
}
return nil
}
바이너리로 변환 함수
// WriteProtobufToBinaryFile protobuf 메시지를 바이너리로 작성
func WriteProtobufToBinaryFile(message proto.Message, filename string) error {
data, err := proto.Marshal(message)
if err != nil {
return fmt.Errorf("cannot marshal proto message to binary : %w", err)
}
err = os.WriteFile(filename, data, 0644)
if err != nil {
return fmt.Errorf("cannot write binary data to file: %w", err)
}
return nil
}
바이너리 읽기 함수
// ReadProtobufFromBinaryFile binary 파일 읽기
func ReadProtobufFromBinaryFile(message proto.Message, filename string) error {
data, err := os.ReadFile(filename)
if err != nil {
return fmt.Errorf("cannot read binary data from file : %w", err)
}
err = proto.Unmarshal(data, message)
if err != nil {
return fmt.Errorf("cannot unmarshal binary to proto message :%w", err)
}
return nil
}