Условная XML-сериализация элементов списка

Я хотел бы знать, можно ли условно исключить элементы в списке из сериализации с использованием шаблона ShouldSerialize*. Например, возьмите два класса:

public class Product{
   public int ID {get; set;}
   public List<Styles> ProductSyles {get; set;}
}

public class Styles{
   public int ID {get; set;}
   public bool Selected {get; set;}
   public string StyleName {get; set;}
}

Могу ли я сериализовать элементы в свойстве ProductStyles только с помощью .Selected = true? Возможно ли это с помощью ShouldSerialize* шаблон


person Neomoon    schedule 16.11.2016    source источник
comment
Сделайте список частным, а затем создайте общедоступное свойство, которое фильтрует список перед возвратом результатов.   -  person jdweng    schedule 16.11.2016


Ответы (1)


XmlSerializer не имеет встроенных функций для пропуска выбранных записей коллекции во время сериализации. Самый быстрый способ реализовать это — использовать свойство суррогатного массива, например:

public class Product
{
    public int ID { get; set; }

    [XmlIgnore]
    public List<Styles> ProductSyles { get; set; }

    [XmlArray("ProductStyles")]
    public Styles [] SerializableProductSyles 
    {
        get
        {
            if (ProductSyles == null)
                return null;
            return ProductSyles.Where(s => s.Selected).ToArray();
        }
        set
        {
            if (value == null)
                return;
            ProductSyles = ProductSyles ?? new List<Styles>();
            ProductSyles.AddRange(value);
        }
    }
}

(Объяснение того, почему суррогатный массив следует использовать вместо суррогатного List<Styles>, см. здесь.)

person dbc    schedule 16.11.2016