C# Odata元数据可以缓存在分布式缓存中吗?

C# Odata元数据可以缓存在分布式缓存中吗?,c#,asp.net,.net-core,odata,C#,Asp.net,.net Core,Odata,有没有办法在分布式缓存中缓存元数据(EdmModel) 我们有一个多租户系统,其中元数据可以根据客户端的不同而变化。我们目前正在为客户机构建元数据,然后将其缓存在内存中。构建此元数据非常昂贵,因此我们必须对其进行缓存 看起来不可能使用二进制序列化来序列化EdmModel,然后使用诸如Redis之类的分布式缓存对其进行缓存 我有以下代码来序列化模型,但它不起作用 IEdmModel model = GetEdmModel(); using (MemoryStream memorystream =

有没有办法在分布式缓存中缓存元数据(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.

是否有其他方法序列化模型?

您可以尝试查看以下内容

专用字节[]转换字节(IEdmModel)
{
使用(var memoryStream=new memoryStream())
{
使用(var writer=XmlWriter.Create(memoryStream))
{
i数不清的错误;
CsdlWriter.TryWriteCsdl(model、writer、CsdlTarget.OData、out错误);
}
返回memoryStream.ToArray();
}
}
专用IEdmModel ConvertFromBytes(字节[]模型字节)
{
使用(var ms=新内存流(modelBytes))
{
使用(var reader=XmlReader.Create(ms))
{
i数不清的错误;
IEDM模型;
if(CsdlReader.TryParse(读卡器,输出模型,输出错误))
{
收益模型;
}
抛出新的InvalidOperationException($”模型错误:{string.Join(“,”,errors.Select(=>quot.ErrorMessage))});
}
}
}
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))}");
        }
    }
}