C# XML映射失效求助:反序列化后部分字段为空或无数据
修正C# XML反序列化实体类映射问题
以下是针对你遇到的Setup/Transaction字段为null、Identities/Charges数组无数据问题的具体修正方案:
核心问题排查与修复步骤
1. 匹配XML元素与实体类属性名称
XML是大小写敏感的,若XML元素名称和类属性名称不一致,必须通过[XmlElement]特性显式指定对应关系。
2. 正确映射嵌套对象
嵌套的类需声明为public,其内部属性同样要标记对应的XML特性,否则反序列化时无法识别嵌套结构。
3. 数组/集合的专属映射配置
对于XML中的数组节点,需用[XmlArray]标记父节点名称,[XmlArrayItem]标记子元素名称;同时集合属性需使用可实例化的类型(如List<T>),避免反序列化后为null。
4. 提前初始化集合
在实体类构造函数中初始化集合,确保反序列化后集合不会是null值。
示例代码
假设你的XML结构如下:
<Root> <Setup> <File>order.xml</File> <SequenceNumber>456</SequenceNumber> </Setup> <Transaction> <TransactionId>TXN-20240501</TransactionId> </Transaction> <Identities> <Identity> <UserId>user_001</UserId> <UserName>John Doe</UserName> </Identity> </Identities> <Charges> <Charge> <ItemId>item_100</ItemId> <Amount>99.99</Amount> </Charge> </Charges> </Root>
修正后的实体类:
using System.Collections.Generic; using System.Xml.Serialization; [XmlRoot("Root")] public class RootModel { public RootModel() { // 初始化集合避免null Identities = new List<Identity>(); Charges = new List<Charge>(); } [XmlElement("Setup")] public Setup Setup { get; set; } [XmlElement("Transaction")] public Transaction Transaction { get; set; } [XmlArray("Identities")] [XmlArrayItem("Identity")] public List<Identity> Identities { get; set; } [XmlArray("Charges")] [XmlArrayItem("Charge")] public List<Charge> Charges { get; set; } } public class Setup { [XmlElement("File")] public string File { get; set; } [XmlElement("SequenceNumber")] public int SequenceNumber { get; set; } } public class Transaction { [XmlElement("TransactionId")] public string TransactionId { get; set; } } public class Identity { [XmlElement("UserId")] public string UserId { get; set; } [XmlElement("UserName")] public string UserName { get; set; } } public class Charge { [XmlElement("ItemId")] public string ItemId { get; set; } [XmlElement("Amount")] public decimal Amount { get; set; } }
反序列化验证代码
using System.IO; using System.Xml.Serialization; using System.Text.Json; // 读取XML内容(替换为你的XML字符串或文件路径) string xmlContent = File.ReadAllText("your_file.xml"); // 反序列化XML到实体类 XmlSerializer serializer = new XmlSerializer(typeof(RootModel)); using StringReader reader = new StringReader(xmlContent); RootModel model = (RootModel)serializer.Deserialize(reader); // 序列化为JSON验证结果 string jsonResult = JsonSerializer.Serialize(model, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine(jsonResult);
内容的提问来源于stack exchange,提问作者miguelito
相关产品推荐
相关产品推荐

