繁体   English   中英

不带属性的序列化或带属性覆盖的反序列化?

[英]Serialize without attribute or deserialize with attribute override?

我有这样的课:

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或将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序列化/反序列化逻辑。 您可以在此链接上获得有关如何执行此操作的更多信息。

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

为此,您需要避免使用不可为空的类型。

只需考虑一下代码上的小变化即可:

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);
}

每个属性可以有一个方法,因此从理论上讲,您还可以为“名称”和“ Id”添加一个ShouldSerialize,但根据我的经验,此技术不适用于不可为空的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM