2016-12-19 8 views
4

私はthisのチュートリアルに続き、シリアル化/マーシャルの構造体をプロトコルバッファに移動しました。私の構造体にはマップがあり、マップのマーシャリングを処理する方法に関するドキュメントは見つかりません。私はシリアライズしたい以下でGoのマップをprotobuffにシリアライズする方法

Fields map[string]string

ゴー構造体:

type Note struct { 
    ID  NoteID 
    Fields map[string]string 
} 

いるProtobufスキーマ:

package internal; 

message Note { 
    optional int64 ID = 1; 
    optional map<string, string> Fields = 2; 
} 

ゴーマーシャル:

func MarshalNote(n *remember.Note) ([]byte, error) { 
    return proto.Marshal(&Note{ 
     ID: proto.Int64(int64(n.ID)) 
     Fields: proto.??? 
    }) 
} 

私は最後の行のために何をすべきか分かりません。フィールドをprotobufスキームにマッピングすることについて話をし、protobufスキームにマップをマッピングすることについては話しません。

答えて

3

protobufはよく定義された検索フォーマットであり、それを使用する利点の1つで、protobufスキーマ(e.i.)だけを使用して、すべてのデータ構造をあなたの好みの言語で生成します。あなたは手動マーシャリングまたは非マーシャルを行う必要はありません

+0

私はここでYandryに同意する傾向がありますが、私はプロトタイプを手動で作成しようとするのではなく、私のために作成するようにしています。それは私も手動でそれを行うに興味があるだろう。終わりには、オートマティック・ジェネレーションがそれを使用しているので、おそらくリフレクションに基づいて、コードがそこになければなりませんか?私はそれがスターウォーズの時間だと思う...ソースを使用してください:) –

+1

ここに例がありますhttps://jacobmartins.com/2016/05/24/practical-golang-using-protobuffs/生成されたコードを確認することができます –

+0

マップキーと値stringを持つ名前付きの子の場合、生成されたタグは次のようになります: 'protobuf:" bytes、1、rep、name = children "json:" children、omitempty "protobuf_key:"バイト、1、opt、name = key "protobuf_val:"バイト、2、opt、name = value " –

関連する問題