#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))}");
}
}
}