我可以在使用OData序列化的模型上放置属性,并选择基于它进行序列化吗?
我已成功扩展ODataResourceSerializer,并重写了CreateStructuralProperty。这使我能够检查属性的名称,并选择是否序列化它。
以下是我设置的内容(正在运行)的摘要。这是我在Startup中注册服务的地方......
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);
}
}
但是,当然,我想使用一个属性来选择是否序列化,而不是硬编码的属性名称。可能?感谢。
答案 0 :(得分:0)
Rockyourteeth
看起来https://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTest正是您要找的。
我的示例是针对5.x版本下的复杂类型,但它可以用于6.x版本下的实体(资源)。
请告诉我它是否适用于您的方案。