Udostępnij za pośrednictwem


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.

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.

Zobacz też