Odata 4 - 如何序列化基于ODataResourceSerializer中的自定义属性的属性

问题描述:

我可以在正在使用OData序列化的模型上放置一个属性,并根据它选择序列化吗?Odata 4 - 如何序列化基于ODataResourceSerializer中的自定义属性的属性

我已经成功扩展了ODataResourceSerializer,并重写了CreateStructuralProperty。这使我能够检查一个属性的名称,并选择是否序列化它。

下面是我已经设置(这是工作)的一个总结。这是我在登记启动服务...

private static void ConfigureODataServices(IContainerBuilder builder) 
    { 
     // add custom odata serializer 
     builder.AddService<ODataSerializerProvider>(Singleton, s => new CustomODataSerializerProvider(s)); 
    } 

这是我的自定义格式,在那里我目前只使用属性名称来选择是否要序列化这个属性:

public class CustomODataSerializerProvider : DefaultODataSerializerProvider 
{ 
    private AnnotatingEntitySerializer _annotatingEntitySerializer; 

    public CustomODataSerializerProvider(IServiceProvider container) : base(container) 
    { 
     _annotatingEntitySerializer = new AnnotatingEntitySerializer(this); 
    } 

    public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType) 
    { 
     if (edmType.Definition.TypeKind == EdmTypeKind.Entity) 
      return new AnnotatingEntitySerializer(this); 

     return base.GetEdmTypeSerializer(edmType); 
    } 
} 


public class AnnotatingEntitySerializer : ODataResourceSerializer 
{ 
    public AnnotatingEntitySerializer(ODataSerializerProvider serializerProvider) 
     : base(serializerProvider) 
    { 
    } 

    public override Microsoft.OData.ODataProperty CreateStructuralProperty(IEdmStructuralProperty structuralProperty, ResourceContext resourceContext) 
    { 
     Microsoft.OData.ODataProperty property = base.CreateStructuralProperty(structuralProperty, resourceContext); 

     if (resourceContext.StructuredType.FullTypeName() == typeof(Site).FullName) 
     { 
      if (property.Name == "IsDeleted") // NOTE: here, rather than checking for the property name, I want to check if it has an attribute of "ExcludeMe" 
      { 
       return null; 
      } 
     } 

     return property; 
    } 

    public override void AppendDynamicProperties(ODataResource resource, System.Web.OData.Formatter.Serialization.SelectExpandNode selectExpandNode, 
     ResourceContext resourceContext) 
    { 
     base.AppendDynamicProperties(resource, selectExpandNode, resourceContext); 
    } 
} 

但当然,我想用一个属性来选择无论是序列化,而不是硬编码的属性名称。可能?谢谢。

Rockyourteeth

看起来https://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTest是你在找什么。

我的示例针对5.x版本以下的复杂类型,但它可以用于6.x版本下的实体(资源)。

请让我知道它是否无法适用于您的方案。