Можно ли кэшировать метаданные Odata в распределенном кэше?

#c# #asp.net #.net-core #odata

#c# #asp.net #.net-core #odata

Вопрос:

Есть ли способ кэшировать метаданные (EdmModel) в распределенном кэше?

У нас есть многопользовательская система, где метаданные могут меняться в зависимости от клиента. В настоящее время мы создаем метаданные для клиента, а затем кэшируем их в памяти. Создание этих метаданных обходится дорого, поэтому мы должны их кэшировать.

Похоже, что невозможно сериализовать EdmModel с помощью двоичной сериализации, а затем кэшировать его с помощью распределенного кэша, такого как Redis.

У меня есть следующий код для сериализации модели, но он не работает.

 IEdmModel model = GetEdmModel();
using (MemoryStream memorystream = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(memorystream, model);  // Error is thrown here
    byte[] yourBytesToDb = memorystream.ToArray();
}
  

Я получаю следующую ошибку

 Type 'Microsoft.OData.Edm.EdmModel' in Assembly 
'Microsoft.OData.Edm, Version=7.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
is not marked as serializable.
  

Есть ли другой способ сериализации модели?

Ответ №1:

Вы можете попробовать посмотреть на следующее.

https://learn.microsoft.com/en-us/odata/odatalib/edm/read-write-model

 private byte[] ConvertToBytes(IEdmModel model)
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = XmlWriter.Create(memoryStream))
        {
            IEnumerable<EdmError> errors;
            CsdlWriter.TryWriteCsdl(model, writer, CsdlTarget.OData, out errors);
        }
        return memoryStream.ToArray();
    }
}

private IEdmModel ConvertFromBytes(byte[] modelBytes)
{
    using (var ms = new MemoryStream(modelBytes))
    {
        using (var reader = XmlReader.Create(ms))
        {
            IEnumerable<EdmError> errors;
            IEdmModel model;
            if (CsdlReader.TryParse(reader, out model, out errors))
            {
                return model;
            }
            throw new InvalidOperationException($"Model Error: {string.Join(",", errors.Select(_ => _.ErrorMessage))}");
        }
    }
}