如何使用 MessagePack 序列化和反序列化 Dictionary<string, object?> 列表并保留类型信息

问题描述 投票:0回答:1

我正在寻找一种使用 MessagePack 和下面的消息类通过网络传输 SQL 查询结果的方法。

public class ExecuteDatabaseQueryResponse : IResponseMessage
{
    [Key(0)]
    public Guid RequestId { get; set; }

    [Key(1)]    
    public required List<Dictionary<string, object?>>? Results { get; set; }
}

这通常是有效的,但有些值会在接收端更改其类型。例如,

decimal
值会变成字符串,
DateTime
Guid
值也会变成字符串。

正确的做法是什么? 我希望仅保留“结果”字段的类型信息。

我尝试添加一个属性,例如:

[MessagePackFormatter(typeof(TypelessFormatter))]

[MessagePackFormatter(typeof(DynamicObjectTypeFallbackFormatter))]

但是没有成功。

c# msgpack messagepack-csharp
1个回答
0
投票

构建一个包含

TypelessObjectResolver
的复合解析器似乎可以完成这项工作。

public static MessagePackSerializerOptions Get()
{
    var resolver = CompositeResolver.Create(
        NativeDecimalResolver.Instance,
        NativeGuidResolver.Instance,
        NativeDateTimeResolver.Instance,
        TypelessObjectResolver.Instance,
        StandardResolver.Instance
    );
    return MessagePackSerializerOptions.Standard.WithResolver(resolver);
}
© www.soinside.com 2019 - 2024. All rights reserved.