Skip to content

MS_ProtocolBuffers

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

Protocol Buffers

概要

  • バイナリエンコード手法

  • IDL を用いる方式を採用している。

  • gRPC の前提となる技術となっている。

  • 互換ライブラリが揃っているため、
    多くの言語でクロスプラットフォームで利用できる。

詳細

主目的

  • ネットワーク上の通信を高速化すること
  • C++ 構造体を用いたデータ格納からの有力な置き換え手段

IDL

  • .proto ファイルに書き、ツールでコードを生成する。
  • 様々な言語がサポートされており、IDL の価値を高めている。
syntax = "proto3";

message Person {
  int32  id   = 1;
  string name = 2;
  repeated string emails = 3;
}

補足: = 1 / = 2フィールド番号であり、 電文にはフィールド名ではなくこの番号が乗る。 MessagePackJSON より小さくなるのはこのためである。

フィールド番号は契約そのものなので、次を守ること。

  • 一度使った番号を別の意味で再利用しない
  • フィールドを削除したら reserved 3; で番号を予約しておく
  • 1〜15 は 1 バイトで符号化されるので、頻出フィールドに割り当てる

スキーマの進化

補足: Protocol Buffers の実用上の要点は 「送受信の双方を同時に更新しなくてよい」ことである。

  • 未知のフィールドは(proto3 の現行実装では)保持されて再送される
  • proto3 では全フィールドが実質 optional であり、 受け側に無いフィールドは無視される

これにより、サービスを段階的にデプロイできる。 互換性を壊す変更は次のとおり。

  • フィールド番号の変更・再利用
  • 型の非互換な変更(int32string など)
  • required の追加(proto2)

.NETでの利用

補足(最新化): .NET では Google.ProtobufGrpc.Tools.proto からのコード生成)が標準である。 .csproj に次のように書くとビルド時に生成される。

<ItemGroup>
  <Protobuf Include="Protos\person.proto" GrpcServices="Server" />
</ItemGroup>

.proto を書かずに C# のクラスから使いたい場合は protobuf-net(Marc Gravell 氏)という選択肢もある。

参考


Tags: IT国際標準, プログラミング, 通信技術, .NET開発, .NET Core, ASP.NET, ASP.NET Web API

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally