Есть ли у сущностей служб таблиц Azure эквивалент NonSerializedAttribute? - PullRequest
11 голосов
/ 21 марта 2011

Если я пытаюсь сериализовать обычный объект CLR и не хочу, чтобы конкретная переменная-член была сериализована, я могу пометить ее с помощью

[NonSerialized]

атрибут. Если я создаю сущность служб таблиц, есть ли эквивалентный атрибут, который я могу использовать, чтобы указать службам таблиц Azure игнорировать это свойство?

Ответы [ 3 ]

9 голосов
/ 22 октября 2013

Для версии 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.

5 голосов
/ 03 марта 2013

Для версии 2.0 Table Storage SDK существует новый способ достижения этой цели.

Теперь вы можете переопределить метод WriteEntity в TableEntity и удалить все свойства объекта, для которых имеется атрибут. Я наследую класс, который делает это для всех моих сущностей, например:

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
{
}

Тогда вы можете использовать этот класс для ваших сущностей, таких как

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

     public string MySerializedProperty { get; set; }

     [NotSerialized]
     public List<string> MyNotSerializedProperty { get; set; }
}
5 голосов
/ 21 марта 2011

Нет такого эквивалента, о котором я знаю.

В этом посте говорится о том, как вы можете достичь желаемого эффекта - http://blogs.msdn.com/b/phaniraj/archive/2008/12/11/customizing-serialization-of-entities-in-the-ado-net-data-services-client-library.aspx

В качестве альтернативы, если вы можете сойти с рук, используя "внутренний", а не«public» в вашей собственности, тогда он не будет сохранен с текущим SDK (но это может измениться в будущем).

...