Estou usando o Blazor WASM com .Net 8 e o pacote Kontent.Ai.Delivery e estou tentando integrar o cache ao sistema. Um problema que estou enfrentando é que, depois de armazenar os dados como JSON no cache, não consigo desserializar os dados no objeto porque a classe é gerada com Kontent AI e é um modelo fortemente tipado como este.
public partial class RichTextModulesType
{
public const string Codename = "rich_text_modules_type";
public const string PositionCodename = "position";
public const string DescriptionCodename = "description";
public const string ImageCodename = "image";
public const string ImagePositionCodename = "image_position";
public const string AdditionalTextCodeName = "additional_text";
public IRichTextContent AdditionalText { get; set; }
public IEnumerable<IMultipleChoiceOption> Position { get; set; }
public IRichTextContent Description { get; set; }
public IEnumerable<IAsset> Image { get; set; }
public IEnumerable<IMultipleChoiceOption> ImagePosition { get; set; }
public IContentItemSystemAttributes System { get; set; }
}
Quando tento desserializar os dados, ocorre o erro
Componente de renderização de exceção não tratada: O tipo de coleção 'Kontent.Ai.Delivery.Abstractions.IRichTextContent' é abstrato, uma interface ou é somente leitura e não pôde ser instanciado e preenchido.
É assim que os dados foram recuperados antes de serializar e colocar no cache
var response = await DeliveryClient.GetItemsAsync<PageType>(
new MyParams("...")
);
if (response.Items.Count() > 0)
{
PageInfo = response.Items.FirstOrDefault<PageType>();
string responseBody = JsonSerializer.Serialize(PageInfo, new JsonSerializerOptions
{
ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles,
MaxDepth = 128
});
await CacheStorageAccessor.StoreAsync(new HttpRequestMessage(HttpMethod.Get, cacheKey), new HttpResponseMessage
{
Content = new StringContent(responseBody)
}, 3600);
}
Quais são minhas opções aqui?
Acredito que sua pergunta está relacionada a um problema existente no SDK de entrega .
O pacote de entrega usa
Newtonsoft.Json
o recurso "under the hood" para fins de desserialização e mapeamento noModelProvider
. Configurado corretamente, o serializador JSON da Newtonsoft é capaz de desserializar para uma interface, então eu diria que a solução mais simples neste caso seria usar o Newtonsoft em vez doSystem.Text.Json
.Dessa forma, você pode usar a
Settings
propriedade pública daSerializationExtensions
classe estática para configurar o serializador JSON:a classe também inclui métodos
FromBson
auxiliaresToBson
que podem ser úteis para o seu caso, mas você pode continuar com sua implementação JSON atual, apenas certifique-se de refatorar seu código para usar oJsonConvert.DeserializeObject
.O ideal é que o SDK e o gerador de modelos sejam migrados
System.Text.Json
e modernizados, mas como isso fará parte de uma grande atualização de todo o stack Kontent.ai OS .NET, incluindo o SDK de gerenciamento, não posso fornecer nenhuma data de lançamento neste momento.Avise-me se tiver mais alguma dúvida ou se algo não estiver claro.