今天在使用 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 如何序列化接口的实现 问题类似
通过 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