不带属性序列化还是带属性覆盖反序列化?
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
它不会在反序列化过程中读取,如果我不设置它会同时将 Entry
和 Id
写入我的序列化文件,而我不会想要。
我知道我可以生成一个完全排除条目的辅助 class 并使用那个特定的序列化,但我很好奇是否有办法让它不会序列化Id 或者它将 Entry
反序列化为 Id
属性?
我也愿意接受其他建议...
编辑:
还尝试使用 XmlIgnoreAttribute
,如此处所述:
我的序列化为 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 的类型。
我有一个 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
它不会在反序列化过程中读取,如果我不设置它会同时将 Entry
和 Id
写入我的序列化文件,而我不会想要。
我知道我可以生成一个完全排除条目的辅助 class 并使用那个特定的序列化,但我很好奇是否有办法让它不会序列化Id 或者它将 Entry
反序列化为 Id
属性?
我也愿意接受其他建议...
编辑:
还尝试使用 XmlIgnoreAttribute
,如此处所述:
我的序列化为 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 的类型。