Могу ли я динамически применять XmlIgnore к свойствам ArrayItem? - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь сериализовать список , где T: EntityObject, и хотел бы пропустить все свойства EntityKey и другие свойства EntityReference из элементов в списке.Можно ли сделать это динамически, возможно, используя XmlAttributeOverrides?

Насколько я вижу, параметры XmlAttributeOverrides действительно указывают только на объект верхнего уровня, то есть на List , а не на сами T, что не очень полезномне.Может кто-нибудь указать мне способ динамического игнорирования свойств ArrayItems?

Вот простой пример, который я использовал, который не использует EntityObjects, но он должен проиллюстрировать, что я хотел бы сделать:

    public class Car
    {
        public String Make { get; set; }
        public String Model { get; set; }
        public Double EngineSize { get; set; }
    }

    [Test]
    public void WouldLoveToDynamicallyLeaveOutMembersOfArrayItems()
    {
        var cars = new List<Car>
                       {
                         new Car
                             {
                                 Make = "Ferrari",
                                 Model = "F1",
                                 EngineSize = 6000
                             },
                         new Car
                             {
                                 Make = "Williams",
                                 Model = "F1",
                                 EngineSize = 5500
                             }
                     };


        var attributeOverrides = new XmlAttributeOverrides();
        attributeOverrides.Add(typeof(Double), "EngineSize", new XmlAttributes {XmlIgnore = true});

        var xs = new XmlSerializer(cars.GetType(), attributeOverrides, new []{ typeof(Car) }, new XmlRootAttribute("cars"), "");
        var ms = new MemoryStream();
        xs.Serialize(ms, cars);
        ms.Position = 0;

        var sr = new StreamReader(ms);
        var result = sr.ReadToEnd();

        Assert.IsFalse(result.Contains("EngineSize"));

    }

1 Ответ

1 голос
/ 11 ноября 2011

Да, вы можете сделать это - основная ошибка в том, что вам нужен typeof (Car) вместо typeof (double). При этом обратите внимание, что XmlAttributeOverrides не просто применяется к объекту верхнего уровня.

Однако я не уверен, что это самый простой маршрут. Во-первых, обратите внимание, что вы должны сохранять и повторно использовать сериализатор при использовании XmlAttributeOverrides, в противном случае вы будете пропускать сборки.

Я ожидаю Основная причина, по которой вы хотите это сделать, заключается в том, что вы не хотите редактировать сгенерированный файл. Однако есть и другой путь; в отдельном файле, в правом пространстве имен, вы можете использовать:

partial class Car {
    public bool ShouldSerializeEngineSize() { return false; }
}

Где «ShouldSerialize *» - это шаблон, распознаваемый и используемый XmlSerializer для управления условной сериализацией. «Частичный» класс - это просто способ объединения двух отдельных файлов кода в один тип (и он был разработан для этого сценария сгенерированного контента).

Таким образом, вам не нужно связываться с XmlAttributeOverrides, и вы можете использовать более простой «новый XmlSeralizer (Type)» (с автоматическим кэшированием для каждого типа).

...