Orleans でのシリアル化の構成
Orleans でのシリアル化の構成は、システム設計全体の重要な部分です。 Orleans には適切な既定値が用意されていますが、ご自分のアプリのニーズに合わせてシリアル化を構成できます。 ホスト間でデータを送信する場合、Orleans.Serialization では Newtonsoft.Json や System.Text.Json などの他のシリアライザーへの委任がサポートされています。 それらの実装によって設定されたパターンに従うことで、他のシリアライザーのサポートを追加できます。 グレイン ストレージの場合は、IGrainStorageSerializer を使ってカスタム シリアライザーを構成することをお勧めします。
Orleans を Newtonsoft.Json
を使用するように構成する
Newtonsoft.Json
を使用して特定の型をシリアル化するように Orleans を構成するには、最初に Microsoft.Orleans.Serialization.NewtonsoftJson NuGet パッケージを参照する必要があります。 次に、シリアライザーを構成し、処理を担当する型を指定します。 次の例では、Newtonsoft.Json
シリアライザーが Example.Namespace
名前空間内のすべての型の処理を担当することを指定します。
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddNewtonsoftJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
前の例では、AddNewtonsoftJsonSerializer への呼び出しによって、Newtonsoft.Json.JsonSerializer
を使用した値のシリアル化と逆シリアル化のサポートを追加しています。 これらの型を処理する必要があるすべてのクライアントで、同様の構成を実行する必要があります。
GenerateSerializerAttribute) でマークされている型については、Orleans は Newtonsoft.Json
シリアライザーよりも生成されたシリアライザーを優先します。
Orleans を System.Text.Json
を使用するように構成する
または、型のシリアル化に System.Text.Json
を使うよう Orleans を構成するには、Microsoft.Orleans.Serialization.SystemTextJson NuGet パッケージを参照します。 次に、シリアライザーを構成し、処理を担当する型を指定します。 次の例では、System.Text.Json
シリアライザーが Example.Namespace
名前空間内のすべての型の処理を担当することを指定します。
- Microsoft.Orleans.Serialization.SystemTextJson NuGet パッケージをインストールします。
- AddJsonSerializer メソッドを使用してシリアライザーを構成します。
ISiloBuilder を操作する場合は、次の例を考えてみてください。
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
外部シリアライザー プロバイダー
シリアル化の構成がすべてのクライアントとサイロで必ず同一になるようにすることが重要です。 構成に不一致があると、シリアル化のエラーが発生するおそれがあります。
IExternalSerializer
を実装するシリアル化プロバイダーは、コードで ClientConfiguration と GlobalConfiguration の SerializationProviderOptions.SerializationProviders プロパティを使用して指定できます。
// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
または、XML 構成で、<Messaging>
の <SerializationProviders />
プロパティの下で指定することもできます。
<Messaging>
<SerializationProviders>
<Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
</SerializationProviders>
</Messaging>
どちらの場合も、複数のプロバイダーを構成できます。 コレクションは順序付けられます。つまり、型 A
と B
をシリアル化できるプロバイダーが、型 B
しかシリアル化できないプロバイダーよりも前に指定されている場合、後者のプロバイダーは使用されません。
関連項目
.NET