zoukankan      html  css  js  c++  java
  • Protobuf示例:Golang and Python

    之前的文章中已经展示过如何在C++中使用protobuf,本文将简单示范protobuf在GolangPython中的使用。

    Talk is cheap. Show you my code.

    首先是Python:

    import addressbook_pb2
    import random
    import uuid
    
    
    def Home():
        return addressbook_pb2.Person.HOME
    
    
    def Work():
        return addressbook_pb2.Person.WORK
    
    
    def Mobile():
        return addressbook_pb2.Person.MOBILE
    
    
    switch = {0: Mobile(), 1: Home(), 2: Work()}
    
    # from protobuf to string
    
    
    def Write2AB(addressbook):
        for i in range(20):
            person = addressbook.people.add()
            person.id = i
            person.name = 'name: ' + str(i)
            person.email = str(i) + '@eamil.com'
    
            phone = person.phones.add()
            phone.type = switch[random.randint(0, 999) % 3]
            phone.number = str(uuid.uuid1())
    
        return addressbook.SerializeToString()
    
    
    def ReadFromAB(addressbook):
        i = 1
        for people in addressbook.people:
            print('
    ======  {} ======'.format(i))
            print('Person ID: ', people.id)
            print('Person Name: ', people.name)
            print('Person Email: ', people.email)
    
            print('Person PhoneNumber:')
            for phone in people.phones:
                if phone.type == addressbook_pb2.Person.MOBILE:
                    print('	 type:Mobile number:{}'.format(phone.number))
                elif phone.type == addressbook_pb2.Person.HOME:
                    print('	 type:Home number:{}'.format(phone.number))
                if phone.type == addressbook_pb2.Person.WORK:
                    print('	 type:work number:{}'.format(phone.number))
            i += 1
    
    
    if __name__ == "__main__":
        ab = addressbook_pb2.AddressBook()
        abString = Write2AB(ab)
        print(abString)
    
        # from string to protobuf
        ab.ParseFromString(abString)
        ReadFromAB(ab)
    

    接下来是Golang:

    package main
    
    import (
    	"fmt"
    	"strconv"
    
    	uuid "github.com/satori/go.uuid"
    
    	"github.com/golang/protobuf/proto"
    	"github.com/zj/tutorial"
    )
    
    // Write2AB return []byte from protobuf
    func Write2AB(ab *tutorial.AddressBook) ([]byte, error) {
    	for i := 0; i < 10; i++ {
    		person := &tutorial.Person{}
    		person.Id = int32(i)
    		person.Name = "name" + strconv.Itoa(i)
    		person.Email = strconv.Itoa(i) + "@email.com"
    
    		phone := &tutorial.Person_PhoneNumber{}
    		switch i % 3 {
    		case 0:
    			phone.Type = tutorial.Person_MOBILE
    		case 2:
    			phone.Type = tutorial.Person_WORK
    		default:
    			phone.Type = tutorial.Person_HOME
    		}
    		phone.Number = uuid.Must(uuid.NewV4()).String()
    
    		person.Phones = append(person.Phones, phone)
    
    		ab.People = append(ab.People, person)
    	}
    
    	return proto.Marshal(ab)
    
    }
    
    // ReadFromBytes read addressbook from []byte
    func ReadFromBytes(abByte []byte) (*tutorial.AddressBook, error) {
    	ab := &tutorial.AddressBook{}
    	err := proto.Unmarshal(abByte, ab)
    	if err != nil {
    		return nil, err
    	}
    	return ab, nil
    }
    
    func main() {
    	ab := &tutorial.AddressBook{}
    
    	abBytes, err := Write2AB(ab)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	ab, err = ReadFromBytes(abBytes)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(ab)
    }
    

    本文采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

  • 相关阅读:
    河北省科技创新年报统计系统分析
    《软件需求十步走》阅读笔记06
    《软件需求十步走》阅读笔记05
    《软件需求十步走》阅读笔记04
    河北科技创新平台年报统计
    《软件需求十步走》阅读笔记03
    《软件需求十步走》阅读笔记02
    《软件需求十步走》阅读笔记01
    案例分析
    2017秋季个人阅读计划
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/12809410.html
Copyright © 2011-2022 走看看