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版本下的实体(资源)。
请让我知道它是否无法适用于您的方案。