我试图将列表中的一个属性反序列化为一个List<String>
对象。如果我使用空格分隔符,我可以反序列化它,但我希望它用逗号或垂直条显得更干净。将xml属性反序列化到列表<String>
是否可以反序列化
<Node Pages="1,2">
成List<String>
或List<int>
?
我的课很简单。
public List<int> Pages;
我试图将列表中的一个属性反序列化为一个List<String>
对象。如果我使用空格分隔符,我可以反序列化它,但我希望它用逗号或垂直条显得更干净。将xml属性反序列化到列表<String>
是否可以反序列化
<Node Pages="1,2">
成List<String>
或List<int>
?
我的课很简单。
public List<int> Pages;
XmlSerializer
不支持这个开箱即用的属性。如果您在控制XML的结构,请考虑使用子元素,因为使用字符分隔的属性字符串完全符合XML的目的。
虽然使用计算属性,但可以解决此问题。但请记住,这会变慢,因为每次访问此属性时,都会解析逗号分隔的字符串。
[XmlAttribute(AttributeName = "Pages")]
public string PagesString { get; set; }
public IList<int> Pages {
get {
return PagesString.Split(',').Select(x => Convert.ToInt32(x.Trim())).ToList();
}
set {
PagesString = String.Join(",", value);
}
}
此外,这个愚蠢的实现并没有考虑到你的字符串中可能有错误的输入。你也应该防范。
要注意的另一件事是,每次访问Pages属性时,都会返回一个新的集合。如果您对返回的值调用Add()
,则此更改不会反映在您的XML中。
在反序列化xml之后改变它会更有效率吗?如果每次访问它都必须解析,它似乎效率很低。 – Histerical
取决于你计划访问多少。如果这只是阅读XML的一个便利属性,那么它可能只被访问一次,无论如何你必须这样做(无论是你还是反序列化器)。 – mstaessen
我真的很喜欢这个解决方案,只是希望有一种方法来解决get; set;通过字符串解析。但它也允许进行不同的处理,例如页面范围。感谢您的帮助! – Histerical
您可以使用空格分隔符进行反序列化,您应该可以使用逗号分隔列表进行反序列化。你在这方面遇到什么问题吗? –
我还没有看到改变分隔值的方式。下面的答案与我已经看到的可能的解决方案类似。 – Histerical