Azure表服务实体是否具有等效的NonSerializedAttribute?

ple*_* me 11 azure azure-table-storage

如果我正在尝试序列化正常的CLR对象,并且我不希望序列化特定的成员变量,我可以使用

[NonSerialized]
Run Code Online (Sandbox Code Playgroud)

属性.如果我正在创建一个表服务实体,是否有一个等效属性可以用来告诉Azure表服务忽略这个属性?

Pet*_*ert 9

对于2.1版,有一个新的Microsoft.WindowsAzure.Storage.Table.IgnoreProperty属性.有关更多信息,请参阅2.1发行说明:http://blogs.msdn.com/b/windowsazurestorage/archive/2013/09/07/announcing-storage-client-library-2-1-rtm.aspx.


Stu*_*art 5

没有相应的我知道的.

这篇文章说明了如何实现预期的效果 - http://blogs.msdn.com/b/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data -Services-客户library.aspx

或者,如果您可以在您的属性上使用"内部"而不是"公共",那么它将不会与当前SDK一起保留(但这可能在将来发生变化).


Rob*_*Rob 5

对于Table Storage SDK 2.0版,有一种新方法可以实现这一点.

您现在可以覆盖TableEntity上的WriteEntity方法,并删除任何具有该属性的实体属性.我派生自一个为我所有实体执行此操作的类,例如:

public class CustomSerializationTableEntity : TableEntity
{
    public CustomSerializationTableEntity()
    {
    }

    public CustomSerializationTableEntity(string partitionKey, string rowKey)
        : base(partitionKey, rowKey)
    {
    }

    public override IDictionary<string, EntityProperty> WriteEntity(Microsoft.WindowsAzure.Storage.OperationContext operationContext)
    {
        var entityProperties = base.WriteEntity(operationContext);

        var objectProperties = this.GetType().GetProperties();

        foreach (PropertyInfo property in objectProperties)
        {
            // see if the property has the attribute to not serialization, and if it does remove it from the entities to send to write
            object[] notSerializedAttributes = property.GetCustomAttributes(typeof(NotSerializedAttribute), false);
            if (notSerializedAttributes.Length > 0)
            {
                entityProperties.Remove(property.Name);
            }
        }

        return entityProperties;
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class NotSerializedAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

然后你可以为你的实体使用这个类

public class MyEntity : CustomSerializationTableEntity
{
     public MyEntity()
     {
     }

     public string MySerializedProperty { get; set; }

     [NotSerialized]
     public List<string> MyNotSerializedProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)