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.
- Installieren Sie das NuGet-Paket Microsoft.Orleans.Serialization.SystemTextJson.
- Konfigurieren Sie das Serialisierungsmodul mithilfe der AddJsonSerializer-Methode.
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.