调用 MessagePackSerializer 的序列化代码如下:
public class HybridCacheMessagePackSerializer<T>
(MessagePackSerializerOptions? options) : IHybridCacheSerializer<T>
{
public T Deserialize(ReadOnlySequence<byte> source)
{
return MessagePackSerializer.Deserialize<T>(source, options);
}
public void Serialize(T value, IBufferWriter<byte> target)
{
MessagePackSerializer.Serialize(target, value, options);
}
}
使用的 MessagePackSerializerOptions:
public static MessagePackSerializerOptions CreateDefaultOptions()
{
var resolver = CompositeResolver.Create(
NativeDateTimeResolver.Instance,
NativeGuidResolver.Instance,
NativeDecimalResolver.Instance,
ContractlessStandardResolver.Instance);
return MessagePackSerializerOptions.Standard.WithResolver(resolver);
}
序列化时报错:
MessagePackSerializationException: Failed to serialize System.Collections.Generic.List`1[[Cnblogs.Cache.Hybrid.Extensions.Tests+BlogPost, HybridCache.MessagePack.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] value.
---> MessagePack.FormatterNotRegisteredException: Cnblogs.Cache.Hybrid.Extensions.Tests+BlogPost is not registered in resolver: MessagePack.Resolvers.StandardResolver
请问如何解决这个问题?
用 ArrayBufferWriter<byte> 测试是正常的
var blogPosts = await GetBlogPostsAsync();
var options = MessagePackSerializerFactory.CreateDefaultOptions();
var writer = new ArrayBufferWriter<byte>();
MessagePackSerializer.Serialize(writer, blogPosts, options);
是因为代码中的错误造成 CreateDefaultOptions() 的值没有传给 HybridCacheMessagePackSerializer,ContractlessStandardResolver.Instance 没生效