You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Microsoft.AspNetCore.OData 8.x中序列化HierarchyId

解决Microsoft.AspNetCore.OData 8.2.0中HierarchyId属性序列化问题

要全局处理所有类中的HierarchyId属性序列化,无需为每个类单独配置,可通过自定义OData原始类型序列化器实现:

1. 创建HierarchyId专属原始序列化器

继承ODataPrimitiveSerializer,重写序列化逻辑,将HierarchyId转换为预期的字符串格式:

public class HierarchyIdPrimitiveSerializer : ODataPrimitiveSerializer
{
    public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
    {
        if (graph is HierarchyId hierarchyId)
        {
            // 将HierarchyId转为"/1/"这类字符串格式
            string hierarchyString = hierarchyId.ToString();
            base.WriteObject(hierarchyString, typeof(string), messageWriter, writeContext);
            return;
        }

        base.WriteObject(graph, type, messageWriter, writeContext);
    }
}

2. 自定义序列化器提供器

继承DefaultODataSerializerProvider,在获取序列化器时判断类型为HierarchyId则返回自定义序列化器:

public class CustomODataSerializerProvider : DefaultODataSerializerProvider
{
    private readonly HierarchyIdPrimitiveSerializer _hierarchyIdSerializer;

    public CustomODataSerializerProvider(IServiceProvider serviceProvider) : base(serviceProvider)
    {
        _hierarchyIdSerializer = new HierarchyIdPrimitiveSerializer();
    }

    public override IODataSerializer GetODataPayloadSerializer(Type type, HttpRequest request)
    {
        // 针对HierarchyId类型返回自定义序列化器
        if (type == typeof(HierarchyId))
        {
            return _hierarchyIdSerializer;
        }

        return base.GetODataPayloadSerializer(type, request);
    }
}

3. 注册自定义序列化器提供器

在DI容器中替换默认的IODataSerializerProvider,让OData使用自定义逻辑:

builder.Services.AddControllers().AddOData(options =>
{
    // 保留你的原有OData配置(如路由、EDM模型、查询选项等)
    options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(100);
    options.AddRouteComponents("odata", GetEdmModel());
})
.Services.AddSingleton<IODataSerializerProvider, CustomODataSerializerProvider>();

说明

  • 之前的JsonConverter<HierarchyId>无效是因为OData拥有独立的序列化体系,不依赖System.Text.Json的转换器。
  • 自定义原始序列化器会作用于所有类中的HierarchyId属性,无需逐个实体类配置。

内容的提问来源于stack exchange,提问作者cflorenciav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:03:23