次の方法で共有


Orleans でのシリアル化の構成

Orleans でのシリアル化の構成は、システム設計全体の重要な部分です。 Orleans には適切な既定値が用意されていますが、ご自分のアプリのニーズに合わせてシリアル化を構成できます。 ホスト間でデータを送信する場合、Orleans.Serialization では Newtonsoft.JsonSystem.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 名前空間内のすべての型の処理を担当することを指定します。

ISiloBuilder を操作する場合は、次の例を考えてみてください。

siloBuilder.Services.AddSerializer(serializerBuilder =>
{
    serializerBuilder.AddJsonSerializer(
        isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});

外部シリアライザー プロバイダー

シリアル化の構成がすべてのクライアントとサイロで必ず同一になるようにすることが重要です。 構成に不一致があると、シリアル化のエラーが発生するおそれがあります。

IExternalSerializer を実装するシリアル化プロバイダーは、コードで ClientConfigurationGlobalConfigurationSerializationProviderOptions.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>

どちらの場合も、複数のプロバイダーを構成できます。 コレクションは順序付けられます。つまり、型 AB をシリアル化できるプロバイダーが、型 B しかシリアル化できないプロバイダーよりも前に指定されている場合、後者のプロバイダーは使用されません。

関連項目