首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以对ArrayItem的属性动态应用XmlIgnore?

是否可以对ArrayItem的属性动态应用XmlIgnore?
EN

Stack Overflow用户
提问于 2011-11-11 13:39:30
回答 1查看 3.8K关注 0票数 1

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

据我所知,XmlAttributeOverrides选项实际上只指向顶层对象,即列表,而不是T本身,这对我没有太大帮助。谁能告诉我一种动态忽略ArrayItems属性的方法?

这是一个我一直在使用的简单示例,它没有使用EntityObjects,但它应该说明我想要做什么:

代码语言:javascript
复制
    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"));

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-11 14:00:31

是的,你可以这样做--主要的错误是你需要的是typeof(Car)而不是typeof(double)。因此,请注意,XmlAttributeOverrides 不只是应用于顶级对象。

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

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

代码语言:javascript
复制
partial class Car {
    public bool ShouldSerializeEngineSize() { return false; }
}

其中"ShouldSerialize*“是XmlSerializer识别并使用的模式,用于控制条件序列化。"partial“类只是将两个单独的代码文件组合成单个类型的一种方法(它是为生成内容的场景而设计的)。

这样一来,你就不需要和XmlAttributeOverrides打交道了,你可以使用更简单的“新XmlSeralizer(类型)”(它有每个类型的自动缓存)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8090107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档