--- lang: ja-jp breaks: true --- # MessagePack `StandardResolverAllowPrivate`、`ContractlessStandardResolverAllowPrivate` を使用した場合のシリアライズの動作 C# 2021-09-19 ## `StandardResolverAllowPrivate`、`ContractlessStandardResolverAllowPrivate` を使用した場合のシリアライズの動作 `StandardResolverAllowPrivate`、`ContractlessStandardResolverAllowPrivate`は、`private`フィールドをシリアライズしてくれるが、以下のようなクラスの場合プロパティもシリアライズされる為、シリアライズ後のサイズが大きくなる。 ```csharp= public class Sample { private string _name; public Sample(string name) { _name = name; } public string Name { get => _name; protected set => _name = value; } } ``` :::info これは、`Name` プロパティの値を `Sample(string name)` コンストラクタの引数としてデシリアライズ時に使用するためにシリアライズしているようだ。 ::: 以下のようなクラスであれば `Name` プロパティがシリアライズされない。 ```csharp= public class Sample { private string _name; // デフォルトコンストラクタを用意する public Sample() { _name = ""; } public Sample(string name) { _name = name; } // 無視するための属性を追加する [MessagePack.IgnoreMember] public string Name { get => _name; protected set => _name = value; } } ``` ###### tags: `MessagePack` `StandardResolverAllowPrivate` `ContractlessStandardResolverAllowPrivate` `C#`