---
# System prepended metadata

title: MessagePack を使用する `MessagePack-CSharp` C# 2021-09-14
tags: [MessagePack, gRPC, C#, MessagePack-CSharp, ASP.NET Core]

---

---
lang: ja-jp
breaks: true
---
# MessagePack を使用する `MessagePack-CSharp` C# 2021-09-14

> neuecc/MessagePack-CSharp
> https://github.com/neuecc/MessagePack-CSharp


## NuGet パッケージ のインストール

```shell=
Install-Package MessagePack
Install-Package MessagePackAnalyzer
```

:::info
Diagnostic Analyzers
オプションの C#アナライザーパッケージをインストールして、コーディングミスに関する警告と自動修正候補を表示して時間を節約します。
:::

#### 拡張 機能

```shell=
Install-Package MessagePack.ReactiveProperty
Install-Package MessagePack.UnityShims
Install-Package MessagePack.AspNetCoreMvcFormatter
```

非常にパフォーマンスの高いフォーマッタを提供する実験的な機能
```shell=
Install-Package MessagePack.Experimental
```

## C#クラスオブジェクトのシリアライズ

> https://github.com/neuecc/MessagePack-CSharp#object-serialization

クラスに `[MessagePackObject(keyAsPropertyName: true)]` 属性を付与すると、プロパティ名をキーとしたシリアライズとなる。

```csharp=
[MessagePackObject(keyAsPropertyName: true)]
public class Sample3
{
    // No need for a Key attribute
    public int Foo { get; set; }

    // If want to ignore a public member, you can use the  IgnoreMember attribute
    [IgnoreMember]
    public int Bar { get; set; }
}
```

```csharp=
MessagePackSerializerOptions option = StandardResolverAllowPrivate.Options
    .WithCompression(MessagePackCompression.Lz4Block);

//var bin2 = MessagePackSerializer.Deserialize<RequestsEx>(objReq, TypelessContractlessStandardResolver.Instance);
var obj_ser = MessagePackSerializer.Serialize<object>(reqEx, option);
var obj_des = MessagePackSerializer.Deserialize<object>(obj_ser, option);

obj_ser = MessagePackSerializer.Serialize<object>(obj_des);
obj_des = MessagePackSerializer.Deserialize<RequestsEx>(obj_ser, option);
```

## MessagePackシリアライザーオプションの種類

:::info
`MessagePack.Resolvers.StandardResolver.cs`より。
https://github.com/neuecc/MessagePack-CSharp/blob/master/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/Resolvers/StandardResolver.cs
:::

* `StandardResolver`
* `ContractlessStandardResolver`
* `StandardResolverAllowPrivate`
* `ContractlessStandardResolverAllowPrivate`

:::info
`ContractlessStandardResolverAllowPrivate`を使用することで、クラスオブジェクトへの`[MessagePackObject(keyAsPropertyName: true)]`属性の記述が不要になる。
:::

###### tags: `MessagePack` `gRPC` `ASP.NET Core` `MessagePack-CSharp` `C#`
