首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Odata元数据可以缓存在分布式缓存中吗?

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

Stack Overflow用户
提问于 2020-11-18 14:34:26
回答 1查看 174关注 0票数 2

有没有办法在分布式缓存中缓存元数据(EdmModel)?

我们有一个多租户系统,其中元数据可以根据客户端的不同而变化。我们目前正在为客户端构建元数据,然后将其缓存为InMemory。构建这些元数据是很昂贵的,所以我们必须缓存它。

看起来不可能使用二进制序列化来序列化EdmModel,然后使用像Redis这样的分布式缓存来缓存它。

我有以下代码来序列化模型,但它不起作用。

代码语言:javascript
复制
IEdmModel model = GetEdmModel();
using (MemoryStream memorystream = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(memorystream, model);  // Error is thrown here
    byte[] yourBytesToDb = memorystream.ToArray();
}

我得到以下错误

代码语言:javascript
复制
Type 'Microsoft.OData.Edm.EdmModel' in Assembly 
'Microsoft.OData.Edm, Version=7.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 
is not marked as serializable.

有没有其他方法来序列化模型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 14:17:04

您可以尝试查看以下内容。

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

代码语言:javascript
复制
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))}");
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64888198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档