You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:59:31