DataContractSerializer反序列化后类属性全为null的问题
解决XML反序列化时列表项属性为Null的问题
这问题我之前也碰到过,大概率是序列化/反序列化的配置和XML结构没匹配上,我给你拆解几个排查方向:
1. 确认Level类的DataContract标记是否正确
你的XML用了http://schemas.datacontract.org/2004/07/这个命名空间,说明是用DataContractSerializer序列化的,那你的Level类必须对应标记:
using System.Runtime.Serialization; [DataContract(Namespace = "http://schemas.datacontract.org/2004/07/")] public class Level { [DataMember] public int size { get; set; } [DataMember] public int difficulty { get; set; } [DataMember] public string title { get; set; } }
重点注意:
- 命名空间要和XML里的完全一致,多一个空格都不行
- 每个需要反序列化的属性都得加
[DataMember] - 属性名要和XML元素的大小写完全匹配(比如XML是
<title>,属性就不能写成Title)
2. 检查反序列化代码是否用对了序列化器
别把DataContractSerializer和XmlSerializer搞混了!这俩是完全不同的序列化机制,不能交叉使用。正确的反序列化代码应该是这样:
using (FileStream fs = new FileStream("你的XML文件路径", FileMode.Open)) { DataContractSerializer serializer = new DataContractSerializer(typeof(List<Level>)); List<Level> levels = (List<Level>)serializer.ReadObject(fs); }
如果之前误用了XmlSerializer,它识别不了DataContract标记,自然读不出属性值。
3. 可选:用DataMember指定元素名(如果不想改属性大小写)
要是你习惯属性首字母大写(比如Title),可以在DataMember里指定XML元素名:
[DataMember(Name = "title")] public string Title { get; set; }
这样就能把类里的Title和XML里的<title>对应上。
4. 快速验证:序列化后立即反序列化测试
写个小测试代码:先序列化一个List<Level>到文件,接着马上反序列化回来。如果这个流程能正常读取属性,那说明你的类和序列化器配置没问题,大概率是原XML文件有格式异常;如果还是读不出属性,那就是类的标记哪里写错了。
内容的提问来源于stack exchange,提问作者Mycom
相关产品推荐
相关产品推荐

