不带属性序列化还是带属性覆盖反序列化?

Serialize without attribute or deserialize with attribute override?

我有一个 class 这样的:

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 写入我的序列化文件,而我不会想要。

我知道我可以生成一个完全排除条目的辅助 class 并使用那个特定的序列化,但我很好奇是否有办法让它不会序列化Id 或者它将 Entry 反序列化为 Id 属性?

我也愿意接受其他建议...

编辑:

还尝试使用 XmlIgnoreAttribute,如此处所述:

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

我的序列化为 true,反序列化为 false,但没有用。


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

还要序列化和反序列化它,我必须注入根元素名称:

XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(root));
using (XmlReader reader = XmlReader.Create(file))
{
    return (T)serializer.Deserialize(reader);
}

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

我建议您实现自己的自定义 XML serialize/deserialize 逻辑。您可以在此 link.

上获得有关如何执行此操作的更多信息

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

您需要避开不可为 null 的类型才能做到这一点...

只需考虑代码上的小改动:

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

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

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

现在您可以告诉序列化器您想要在序列化过程中排除某些字段,方法是向 class 添加一个名为 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 和 Id 添加一个 ShouldSerialize,但根据我的经验,此技术不适用于不可为 null 的类型。