Конфигурация сериализации в Orleans

Конфигурация сериализации является Orleans важной частью общей системы проектирования. Хотя Orleans предоставляет разумные значения по умолчанию, можно настроить сериализацию в соответствии с потребностями ваших приложений. Для отправки данных между узлами Orleans.Serialization поддерживает делегирование другим сериализаторам, таким как Newtonsoft.Json и System.Text.Json. Вы можете добавить поддержку для других сериализаторов, следуя шаблону, заданному этими реализациями. Для хранения зерна рекомендуется использовать IGrainStorageSerializer для настройки пользовательского сериализатора.

Настройка Orleans использования Newtonsoft.Json

Чтобы настроить Orleans сериализацию определенных типов, Newtonsoft.Jsonнеобходимо сначала ссылаться на Microsoft.Orleans. Пакет NuGet Serialization.NewtonsoftJson . Затем настройте сериализатор, указав типы, за которые он будет отвечать. В следующем примере мы укажем, что 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

Кроме того, чтобы настроить OrleansSystem.Text.Json сериализацию типов, вы ссылаетесь на Microsoft.Orleans. Пакет NuGet Serialization.SystemTextJson . Затем настройте сериализатор, указав типы, за которые он будет отвечать. В следующем примере мы укажем, что System.Text.Json сериализатор будет отвечать за все типы в Example.Namespace пространстве имен.

Рассмотрим следующий пример при взаимодействии с :ISiloBuilder

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

Поставщики внешних сериализаторов

Важно убедиться, что конфигурация сериализации идентична для всех клиентов и силосов. Если конфигурации несогласованы, могут возникать ошибки сериализации.

Поставщики сериализации, которые реализуют IExternalSerializer , можно указать с помощью SerializationProviderOptions.SerializationProviders свойства ClientConfiguration и GlobalConfiguration в коде:

// 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-конфигурации в свойстве <SerializationProviders /><Messaging>:

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

В обоих случаях можно настроить несколько поставщиков. Коллекция упорядочена, что означает, что если поставщик, который может сериализовать типы A и B указан перед поставщиком, который может сериализовать только тип B, то последний поставщик не будет использоваться.

См. также