Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将xml属性反序列化为列表<;字符串>;_C#_Xml_Serialization - Fatal编程技术网

C# 将xml属性反序列化为列表<;字符串>;

C# 将xml属性反序列化为列表<;字符串>;,c#,xml,serialization,C#,Xml,Serialization,我正在尝试将具有页面列表的属性反序列化为列表对象。如果我使用空格分隔符,我可以很好地对它进行反序列化,但我希望它使用逗号或竖条看起来更干净 可以反序列化吗 <Node Pages="1,2"> 进入列表或列表 我的课也很简单 public List<int> Pages; 公共列表页面; XmlSerializer不支持这种开箱即用的属性。如果您对XML的结构进行控制,请考虑使用子元素,因为使用字符分隔的属性字符串完全胜过XML的目的。 您可以通过使用计算属性来解

我正在尝试将具有页面列表的属性反序列化为
列表
对象。如果我使用空格分隔符,我可以很好地对它进行反序列化,但我希望它使用逗号或竖条看起来更干净

可以反序列化吗

<Node Pages="1,2">

进入
列表
列表

我的课也很简单

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);
    }
}
[xmltattribute(AttributeName=“Pages”)]
公共字符串PagesString{get;set;}
公共IList页面{
得到{
返回PagesString.Split(',).Select(x=>Convert.ToInt32(x.Trim()).ToList();
}
设置{
PagesString=String.Join(“,”,value);
}
}
而且,这个愚蠢的实现没有考虑到字符串中可能存在错误的输入。你也应该警惕这一点


另外需要注意的是,每次访问Pages属性时,都会返回一个新集合。如果对返回值调用
Add()
,此更改将不会反映在XML中。

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);
    }
}
[xmltattribute(AttributeName=“Pages”)]
公共字符串PagesString{get;set;}
公共IList页面{
得到{
返回PagesString.Split(',).Select(x=>Convert.ToInt32(x.Trim()).ToList();
}
设置{
PagesString=String.Join(“,”,value);
}
}
而且,这个愚蠢的实现没有考虑到字符串中可能存在错误的输入。你也应该警惕这一点


另外需要注意的是,每次访问Pages属性时,都会返回一个新集合。如果对返回的值调用
Add()
,此更改将不会反映在XML中。

使用空格分隔符反序列化的方式应该也可以使用逗号分隔列表反序列化。你在这方面有什么问题吗?我还没有看到一种改变的方法,那就是界定价值。下面的答案类似于我所看到的一种可能的解决方案。使用空格分隔符反序列化的方式应该也可以使用逗号分隔的列表进行反序列化。你在这方面有什么问题吗?我还没有看到一种改变的方法,那就是界定价值。下面的答案与我所看到的可能的解决方案类似。在反序列化xml之后,改变这一点会更有效吗?如果每次访问它时都要对其进行解析,那么它似乎效率很低。这取决于您计划访问多少。如果这只是一个读取XML的便利属性,那么它可能只会被访问一次,而且您无论如何都必须这样做(无论是您还是反序列化程序);设置解析字符串。但它也允许不同的处理,例如页面范围。谢谢你的帮助!在对xml进行反序列化之后,改变这种情况会更有效吗?如果每次访问它时都要对其进行解析,那么它似乎效率很低。这取决于您计划访问多少。如果这只是一个读取XML的便利属性,那么它可能只会被访问一次,而且您无论如何都必须这样做(无论是您还是反序列化程序);设置解析字符串。但它也允许不同的处理,例如页面范围。谢谢你的帮助!