没有属性的序列化或使用属性覆盖反序列化?

时间:2015-01-19 17:10:56

标签: c# xml serialization

我有一个这样的课程:

public class Item
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlAttribute("Id")]
    public int Id { get; set; }
    [XmlAttribute("Entry")]
    public int Entry { get { return this.Id; } set { this.Id = value; } }
}

我不想序列化Entry属性,但仍希望能够从具有所述属性的文件中反序列化它。

如果我设置XmlIgnore它将在反序列化期间无法读取,如果我不这样做,它会将EntryId写入我不想要的序列化文件。

我知道我可以生成一个完全排除Entry的二级类,并使用该特定序列进行序列化,但是如果有一种方法可以使它变得好奇,那么它将不会序列化Id,或者它将反序列化{ {1}}改为Entry属性?

我也对其他建议持开放态度......

编辑:

还尝试使用Id,如下所述:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore%28v=vs.110%29.aspx

我的序列化为true,反序列化为false,但无法正常工作。


为了进一步澄清这个问题,XML的格式化不是我控制的,而我正在做的只是第三方应用程序,它将读取这些文件并将其保存回来。对我来说,XmlIgnoreAttribute属性是多余的,不需要,因此我将它保存为Id,因为它们是相同的,但有许多元素没有Entry,而是它们有Id,一旦我的应用程序用于阅读和重新保存文件,它将删除Entry并将其另存为Entry

同样为了序列化和反序列化它我必须注入根元素名称:

Id

因为根名称因文件而异,所以我必须注入它。

2 个答案:

答案 0 :(得分:1)

我建议您实现自己的自定义XML序列化/反序列化逻辑。您可以在此链接上获得有关如何执行此操作的更多信息。

http://www.codeproject.com/Articles/474453/How-to-customize-XML-serialization

答案 1 :(得分:1)

你需要避开非可空类型才能做到这一点......

只考虑代码上的小改动:

public class Item
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlAttribute("Id")]
    public int Id { get; set; }

    [XmlAttribute("Entry")]
    public string Entry { get; set; }
}

现在,您可以通过向名为ShouldSerializeXYZ()的类添加成员函数来告诉序列化程序您要在序列化过程中排除某些字段,其中XYZ是您要控制的字段的名称。

在这种情况下,所需的功能如下:

public bool ShouldSerializeEntry()
{
    // Here you complete control on when to include the field
    // As a simple example I excluded the field if its empty
    // But you can make more complex conditions 
    return !String.IsNullOrEmpty(Entry);
}

每个属性可以有一个方法,所以从理论上讲你也可以为Name添加一个ShouldSerialize,但是根据我的经验,这种技术不能用于非可空类型。