dotnetcore / dotnetcore/EasyCaching

Cannot initialize MemoryPack with UseDisk

Open
#476 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
C#
Stars
2.1k
Forks
336
PR merge metrics
No merged PRs in 30d

Description

Simple reproduction. Create new console project, add following nugets.

- EasyCaching.Disk 1.9.0
- EasyCaching.Serialization.MemoryPack 1.9.0
- .NET 7

Copy & paste the following code and run.

```csharp
// See https://aka.ms/new-console-template for more information

using EasyCaching.Core;
using EasyCaching.Disk;
using EasyCaching.Serialization.MemoryPack;
using MemoryPack;
using Microsoft.Extensions.DependencyInjection;

var sc = new ServiceCollection();
sc.AddEasyCaching(o =>
{
o.UseDisk(config =>
{
config.SerializerName = "mempack";
config.DBConfig = new DiskDbOptions { BasePath = Path.GetTempPath() };
}).WithMemoryPack();
});

ServiceProvider sp = sc.BuildServiceProvider();
IEasyCachingProvider provider = sp.GetRequiredService();

provider.Set("CACHE_KEY", new Test(), TimeSpan.FromDays(1));

Console.ReadLine();

[MemoryPackable]
public partial class Test
{
public string Name { get; set; } = "asdf";
}
```

**Expected behavior:** No exception is thrown, `Test` class value is cached on disk with CACHE_KEY in MemoryPack format.

**Actual behavior:**
`System.MissingMethodException: 'Method not found: 'Void MemoryPack.MemoryPackSerializerOptions.set_StringEncoding(MemoryPack.StringEncoding)'.'`

Call stack

```
at EasyCaching.Serialization.Json.MemoryPackOptionsExtension.b__3_1(IServiceProvider x)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider)
at EasyCaching.Disk.DiskOptionsExtension.b__3_0(IServiceProvider x)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Program.$(String[] args) in C:\Users\lesar\Source\Repos\Locura\src\ConsoleTest\Program.cs:line 20
```

Also, I was little surprised by the first line in the call stack

`at EasyCaching.Serialization.Json.MemoryPackOptionsExtension.b__3_1(IServiceProvider x)`

...because MemoryPack is binary serialization, not JSON.

So I looked [here](https://github.com/dotnetcore/EasyCaching/blob/dev/serialization/EasyCaching.Serialization.MemoryPack/Configurations/MemoryPackOptionsExtension.cs) to see that indeed `MemoryPackOptionsExtension` is indeed in the `EasyCaching.Serialization.Json` namespace.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.