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

使用$select或$expand时自定义ODataResourceSerializer序列化异常

解决OData 9中使用$select/$expand时自定义序列化器无法获取Geometry对象的问题

当使用$select或$expand查询选项时,OData会用SelectAll<T>或SelectSome<T>这类包装类封装原始实体,目的是仅序列化指定属性。你的自定义序列化器直接判断graph是否为Geometry类型会失败,因为此时graph是包装类实例而非实际的Geometry对象。

解决方案:先解开OData的查询包装类

添加一个辅助方法来提取包装类内部的实际实体,再进行Geometry类型判断:

private object UnwrapSelectWrapper(object graph)
{
    var graphType = graph.GetType();
    
    // 检查是否是SelectAll或SelectSome泛型包装类
    if (graphType.IsGenericType)
    {
        var genericDef = graphType.GetGenericTypeDefinition();
        if (genericDef == typeof(SelectAll<>) || genericDef == typeof(SelectSome<>))
        {
            // 提取包装类内部的Value属性(OData 9中SelectWrapper的实体存储在Value属性)
            var valueProp = graphType.GetProperty("Value");
            return valueProp?.GetValue(graph) ?? graph;
        }
    }
    
    return graph;
}

修改自定义序列化器方法

在WriteObjectInlineAsync中先调用上述方法解开包装,再处理Geometry序列化:

public override async Task WriteObjectInlineAsync(
    object graph,
    IEdmTypeReference expectedType,
    ODataWriter writer,
    ODataSerializerContext writeContext)
{
    try
    {        
        // 先解开OData的查询包装类
        var unwrappedGraph = UnwrapSelectWrapper(graph);
        
        if (unwrappedGraph is NetTopologySuite.Geometries.Geometry geometry)
        {
            // 处理Geometry类型的序列化逻辑
            var serializedGeometry = geometry.SerializeGeomerty();
            await writer.WriteStartAsync(serializedGeometry);
            await writer.WriteEndAsync();
        }
        else
        {
            // 回退到默认序列化行为
            await base.WriteObjectInlineAsync(graph, expectedType, writer, writeContext);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error during serialization: {ex.Message}");
        throw;
    }
}

补充说明

  • 若OData版本更新后包装类的属性名发生变化(比如从Value改为Entity),只需调整反射获取的属性名称即可。
  • 该方法仅处理一级包装,若存在多层嵌套包装(极少出现),可将辅助方法改为递归调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:33:28