我可以动态地将XmlIgnore应用于ArrayItem的属性吗?

时间:2011-11-11 05:39:30

标签: c# .net xml-serialization

我正在尝试序列化List< T>其中T:EntityObject,并希望从列表中的项目中省略所有EntityKey和其他EntityReference属性。可以使用XmlAttributeOverrides动态完成吗?

据我所知,XmlAttributeOverrides选项仅指向顶级对象,即List< T>。而不是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 个答案:

答案 0 :(得分:1)

是的,你可以这样做 - 主要的错误是你需要typeof(Car)而不是typeof(double)。有了这个,请注意XmlAttributeOverrides 只适用于顶级注入。

但是,我不确定这是最简单的路线。首先,请注意, 必须 在使用XmlAttributeOverrides时存储并重新使用序列化程序,否则会泄漏程序集。

期待你想要这样做的主要原因是因为你不想编辑他生成的文件。但是,还有另一种方式;在单独的文件中,在正确的命名空间中,您可以使用:

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

其中“ShouldSerialize *”是XmlSerializer识别并使用的模式,用于控制条件序列化。 “部分”类只是将两个单独的代码文件组合成单个类型的一种方式(并且是为此生成内容方案设计的)。

这样,你不需要乱用XmlAttributeOverrides,你可以使用更简单的“new XmlSeralizer(Type)”(每种类型都有自动缓存)。