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);
}
}
もちろん、ハードコードされたプロパティ名ではなく、シリアル化されているかどうかを選択する属性を使用したいと思います。可能?ありがとう。それはhttps://github.com/xuzhg/WebApiSample/tree/master/WebApiComplexTypeSkipPropertyTestに見える