首页 新闻 会员 周边 捐助

MessagePack for C# 序列化时如何支持类型继承场景

0
悬赏园豆:30 [已解决问题] 解决于 2025-07-02 17:53

今天在使用 Redis 保存缓存数据时遇到的一个问题, Redis 客户端的序列化器用的是 MessagePack for C#,在针对下面的继承类型进行序列化时,遇到了 Children 丢失子类属性的问题

public class TreeNode<T>
{
    public virtual int Id { get; set; }
    public int? ParentId { get; set; }
    public bool IsLeaf { get; set; }
    public List<TreeNode<T>> Children { get; set; } = [];
}
public class TreeCategoryDto : TreeNode<TreeCategoryDto>
{
    public int CategoryId { get; set; }
    public override int Id { get => CategoryId; set => CategoryId = value; } 
    public string Title { get; set; }
    public int ItemCount { get; set; }
    public int ChildCount => Children?.Count ?? 0;
}

与之前遇到的 System.Text.Json 如何序列化接口的实现 问题类似

dudu的主页 dudu | 高人七级 | 园豆:24807
提问于:2025-07-02 14:24
< >
分享
最佳答案
0

通过 Union attribute 解决了

[Union(0, typeof(TreeCategoryDto))]
public abstract class TreeNode<T>
{
    public virtual int Id { get; set; }
    public int? ParentId { get; set; }
    public bool IsLeaf { get; set; }
    public List<TreeNode<T>> Children { get; set; } = [];
}

解决方法来自 Polymorphic Serialization/Deserialization with discriminator property

dudu | 高人七级 |园豆:24807 | 2025-07-02 17:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册