.NET7中Protobuf-net结合Redis缓存ProtoContract对象及EasyCaching问题求助
解决方案:.NET7中Protobuf-net结合Redis缓存实现及EasyCaching序列化器错误修复
方案一:直接使用StackExchange.Redis + Protobuf-net
无需依赖第三方缓存框架,直接控制序列化与Redis交互逻辑,轻量且灵活:
- 安装依赖包
Install-Package StackExchange.Redis Install-Package protobuf-net
- 定义带Protobuf标记的实体类
[ProtoContract] public class CacheItem { [ProtoMember(1)] public int Id { get; set; } [ProtoMember(2)] public string Name { get; set; } // 其余字段按需求添加[ProtoMember(n)]标记,n需唯一 }
- 封装Redis缓存操作服务
public class RedisCacheService { private readonly IDatabase _redisDb; public RedisCacheService(IConnectionMultiplexer redisMultiplexer) { _redisDb = redisMultiplexer.GetDatabase(); } public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null) where T : class { using var ms = new MemoryStream(); Serializer.Serialize(ms, value); ms.Position = 0; await _redisDb.StringSetAsync(key, ms.ToArray(), expiry); } public async Task<T?> GetAsync<T>(string key) where T : class { var data = await _redisDb.StringGetAsync(key); if (!data.HasValue) return null; using var ms = new MemoryStream(data); return Serializer.Deserialize<T>(ms); } }
- 注册服务到DI容器
在Program.cs中添加:
// 替换为你的Redis连接字符串 var redisConn = ConnectionMultiplexer.Connect("localhost:6379,password=your_password"); builder.Services.AddSingleton<IConnectionMultiplexer>(redisConn); builder.Services.AddSingleton<RedisCacheService>();
方案二:修复EasyCaching序列化器缺失错误
你遇到的ArgumentNullException是因为EasyCaching的Redis提供者未绑定序列化器,需显式注册Protobuf序列化器:
- 安装扩展包
Install-Package EasyCaching.Redis Install-Package EasyCaching.Serialization.Protobuf
- 配置EasyCaching服务
在Program.cs中:
builder.Services.AddEasyCaching(options => { // 配置Redis实例 options.UseRedis(config => { config.DBConfig.Endpoints.Add(new ServerEndPoint("localhost", 6379)); config.DBConfig.Database = 0; config.DBConfig.Password = "your_password"; // 按需添加 config.CacheKeyPrefix = "app_cache:"; // 可选,添加键前缀 }, "main_redis"); // 注册Protobuf序列化器(关键步骤,缺失会导致报错) options.WithProtobuf(); });
- 注入并使用缓存服务
public class DemoService { private readonly IEasyCachingProvider _cache; // 通过工厂获取指定名称的缓存提供者 public DemoService(IEasyCachingProviderFactory cacheFactory) { _cache = cacheFactory.GetCachingProvider("main_redis"); } public async Task SaveToCacheAsync() { var item = new CacheItem { Id = 100, Name = "DemoData" }; await _cache.SetAsync("demo_key", item, TimeSpan.FromMinutes(15)); } public async Task<CacheItem?> GetFromCacheAsync() { return await _cache.GetAsync<CacheItem>("demo_key"); } }
错误根源说明
EasyCaching不会自动注册序列化器,必须通过WithProtobuf()显式绑定,否则DefaultRedisCachingProvider构造时会因serializers参数为空抛出异常。
内容的提问来源于stack exchange,提问作者GGleGrand
相关产品推荐
相关产品推荐

