Freigeben über


Konfigurieren der Serialisierung in Orleans

Die Konfiguration der Serialisierung in Orleans ist ein wichtiger Bestandteil des gesamten Systemdesigns. Orleans bietet zwar sinnvolle Standardwerte, Sie können die Serialisierung jedoch so konfigurieren, dass sie den Anforderungen Ihrer Apps entspricht. Für das Senden von Daten zwischen Hosts unterstützt Orleans.Serialization die Delegierung an andere Serialisierungsmodule wie Newtonsoft.Json und System.Text.Json. Sie können Unterstützung für andere Serialisierungsmodule hinzufügen, indem Sie dem von diesen Implementierungen festgelegten Muster folgen. Für Grainspeicher sollten Sie vorzugsweise IGrainStorageSerializer verwenden, um ein benutzerdefiniertes Serialisierungsmodul zu konfigurieren.

Konfigurieren von Orleans zur Verwendung von Newtonsoft.Json

Um Orleans für das Serialisieren bestimmter Typen mithilfe von Newtonsoft.Json zu konfigurieren, müssen Sie zuerst auf das NuGet-Paket Microsoft.Orleans.Serialization.NewtonsoftJson verweisen. Konfigurieren Sie dann das Serialisierungsmodul, und geben Sie an, für welche Typen es zuständig ist. Im folgenden Beispiel wird angegeben, dass das Serialisierungsmodul Newtonsoft.Json für alle Typen im Namespace Example.Namespace zuständig ist.

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

Im vorherigen Beispiel fügt der Aufruf von AddNewtonsoftJsonSerializer die Unterstützung für die Serialisierung und Deserialisierung von Werten mithilfe von Newtonsoft.Json.JsonSerializer hinzu. Eine ähnliche Konfiguration muss für alle Clients erfolgen, die diese Typen handhaben müssen.

Bei Typen, die mit GenerateSerializerAttribute gekennzeichnet sind, bevorzugt Orleans das generierte Serialisierungsmodul gegenüber dem Newtonsoft.Json-Serialisierungsmodul.

Konfigurieren von Orleans zur Verwendung von System.Text.Json

Alternativ verweisen Sie zum Konfigurieren von Orleans zur Verwendung von System.Text.Json, um Ihre Typen zu serialisieren, auf das NuGet-Paket Microsoft.Orleans.Serialization.SystemTextJson. Konfigurieren Sie dann das Serialisierungsmodul, und geben Sie an, für welche Typen es zuständig ist. Im folgenden Beispiel wird angegeben, dass das Serialisierungsmodul System.Text.Json für alle Typen im Namespace Example.Namespace zuständig ist.

Betrachten Sie das folgende Beispiel, wenn Sie mit ISiloBuilder interagieren:

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

Externe Serialisierungsanbieter

Es ist wichtig, sicherzustellen, dass die Serialisierungskonfiguration auf allen Clients und Silos identisch ist. Wenn Konfigurationen inkonsistent sind, können Serialisierungsfehler auftreten.

Serialisierungsanbieter, die IExternalSerializer implementieren, können mithilfe der SerializationProviderOptions.SerializationProviders-Eigenschaft ClientConfiguration und GlobalConfiguration im Code angegeben werden:

// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
    typeof(FantasticSerializer).GetTypeInfo());

Alternativ können sie in der XML-Konfiguration unter der <SerializationProviders />-Eigenschaft <Messaging> angegeben werden:

<Messaging>
    <SerializationProviders>
        <Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
    </SerializationProviders>
</Messaging>

In beiden Fällen können mehrere Anbieter konfiguriert werden. Die Sammlung ist sortiert, d. h., wenn ein Anbieter, der die Typen A und B serialisieren kann, vor einem Anbieter angegeben wird, der nur den Typ B serialisieren kann, wird der letztere Anbieter nicht verwendet.

Weitere Informationen