備忘録

備忘録

C#でprotobuf-netを使ってデフォルト値を強制的に出力する方法

Ⅰ. はじめに

タイトルの通り「C#でprotobuf-netを使ってデフォルト値を強制的に出力する方法」です。
protobuf-netはデフォルト値を出力しません。

ageが省略された例

Human.proto

syntax = "proto3";
package MyPackage;

message Human {
  string name = 1;
  uint32 age = 2;
}

f:id:kagasu:20180429234548p:plain

Ⅱ. やり方

サンプルプログラム
using MyPackage;
using ProtoBuf.Meta;

private static RuntimeTypeModel Serializer { get; set; } = TypeModel.Create();

static void Main(string[] args)
{
  var human = new Human
  {
    Name = "name001",
    Age = 0
  };

  using (var ms = new MemoryStream())
  {
    Serializer.UseImplicitZeroDefaults = false;
    Serializer.Serialize(ms, human);

    byte[] bytes = ms.ToArray();
    Console.WriteLine(BitConverter.ToString(bytes).Replace("-", " "));
  }
}

実行結果

f:id:kagasu:20180429234650p:plain