2016-12-28 92 views
0

我试图将列表中的一个属性反序列化为一个List<String>对象。如果我使用空格分隔符,我可以反序列化它,但我希望它用逗号或垂直条显得更干净。将xml属性反序列化到列表<String>

是否可以反序列化

<Node Pages="1,2"> 

List<String>List<int>

我的课很简单。

public List<int> Pages; 
+1

您可以使用空格分隔符进行反序列化,您应该可以使用逗号分隔列表进行反序列化。你在这方面遇到什么问题吗? –

+0

我还没有看到改变分隔值的方式。下面的答案与我已经看到的可能的解决方案类似。 – Histerical

回答

1

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中。

+0

在反序列化xml之后改变它会更有效率吗?如果每次访问它都必须解析,它似乎效率很低。 – Histerical

+0

取决于你计划访问多少。如果这只是阅读XML的一个便利属性,那么它可能只被访问一次,无论如何你必须这样做(无论是你还是反序列化器)。 – mstaessen

+0

我真的很喜欢这个解决方案,只是希望有一种方法来解决get; set;通过字符串解析。但它也允许进行不同的处理,例如页面范围。感谢您的帮助! – Histerical