Konfiguracja serializacji w programie Orleans
Konfiguracja serializacji w Orleans systemie jest kluczową częścią ogólnego projektu systemu. Chociaż Orleans zapewnia rozsądne wartości domyślne, można skonfigurować serializacji zgodnie z potrzebami aplikacji. W przypadku wysyłania danych między hostami Orleans.Serialization obsługuje delegowanie do innych serializatorów, takich jak Newtonsoft.Json i System.Text.Json. Obsługę innych serializatorów można dodać, postępując zgodnie ze wzorcem ustawionym przez te implementacje. W przypadku przechowywania ziarna najlepiej użyć IGrainStorageSerializer do skonfigurowania niestandardowego serializatora.
Konfigurowanie Orleans do użycia Newtonsoft.Json
Aby skonfigurować Orleans serializacji niektórych typów przy użyciu programu Newtonsoft.Json
, należy najpierw odwołać się do pliku Microsoft.Orleans. Serialization.NewtonsoftJson NuGet package. Następnie skonfiguruj serializator, określając, które typy będą odpowiedzialne. W poniższym przykładzie określimy, że Newtonsoft.Json
serializator będzie odpowiedzialny za wszystkie typy w Example.Namespace
przestrzeni nazw.
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddNewtonsoftJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
W poprzednim przykładzie wywołanie AddNewtonsoftJsonSerializer funkcji dodaje obsługę serializacji i deserializacji wartości przy użyciu metody Newtonsoft.Json.JsonSerializer
. Podobną konfigurację należy wykonać na wszystkich klientach, którzy muszą obsługiwać te typy.
W przypadku typów oznaczonych znakiem GenerateSerializerAttribute), Orleans wolisz wygenerowany serializator nad serializatorem Newtonsoft.Json
.
Konfigurowanie Orleans do użycia System.Text.Json
Alternatywnie, aby skonfigurować Orleans do użycia System.Text.Json
w celu serializacji typów, należy odwołać się do microsoft .Orleans. Serialization.SystemTextJson Pakiet NuGet. Następnie skonfiguruj serializator, określając, które typy będą odpowiedzialne. W poniższym przykładzie określimy, że System.Text.Json
serializator będzie odpowiedzialny za wszystkie typy w Example.Namespace
przestrzeni nazw.
- Zainstaluj microsoft .Orleans. Serialization.SystemTextJson Pakiet NuGet.
- Skonfiguruj serializator przy użyciu AddJsonSerializer metody .
Podczas interakcji z usługą należy wziąć pod uwagę następujący przykład:ISiloBuilder
siloBuilder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace.StartsWith("Example.Namespace"));
});
Zewnętrzni dostawcy serializatora
Ważne jest, aby upewnić się, że konfiguracja serializacji jest identyczna dla wszystkich klientów i silosów. Jeśli konfiguracje są niespójne, mogą wystąpić błędy serializacji.
Dostawcy serializacji, którzy implementują IExternalSerializer
, można określić za pomocą SerializationProviderOptions.SerializationProviders właściwości ClientConfiguration i GlobalConfiguration w kodzie:
// Client configuration
var clientConfiguration = new ClientConfiguration();
clientConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
// Global configuration
var globalConfiguration = new GlobalConfiguration();
globalConfiguration.SerializationProviders.Add(
typeof(FantasticSerializer).GetTypeInfo());
Alternatywnie można je określić w konfiguracji XML we <SerializationProviders />
właściwości <Messaging>
:
<Messaging>
<SerializationProviders>
<Provider type="GreatCompany.FantasticSerializer, GreatCompany.SerializerAssembly" />
</SerializationProviders>
</Messaging>
W obu przypadkach można skonfigurować wielu dostawców. Kolekcja jest uporządkowana, co oznacza, że jeśli dostawca, który może serializować typy A
i B
jest określony przed dostawcą, który może serializować tylko typ B
, ten ostatni dostawca nie będzie używany.