如何定义类结构实现含动态属性的自定义XML格式序列化
解决方案
该方案完全可行,.NET 标准 XML 序列化(XmlSerializer)提供了 [XmlAnyAttribute] 特性,专门用于承载编译时无法确定的动态属性,刚好适配你的需求。
调整后的类结构
using System.Xml; using System.Xml.Serialization; // 根节点对应配置 [XmlRoot("PerfCheckConsidered")] public class PerfCheckConsidered { [XmlElement("PerfMarker")] public List<PerfMarker> PerfMarkers { get; set; } = new List<PerfMarker>(); } public class PerfMarker { // 固定属性标记为XmlAttribute,序列化时会生成为节点属性 [XmlAttribute] public string PerfMarkerName { get; set; } [XmlAttribute] public string PercentageIncrease { get; set; } [XmlAttribute] public string MaxValue { get; set; } [XmlAttribute] public string MinValue { get; set; } // 所有动态时间戳属性由该字段承载,不需要额外定义属性 [XmlAnyAttribute] public XmlAttribute[] TimeStampAttributes { get; set; } }
数据填充&序列化示例
1. 填充动态时间戳属性
// 示例:你从本地文件读取到的时间戳与对应值的映射 var timeStampValues = new Dictionary<string, double> { {"TS_09082021093913", 5961.733}, {"TS_09082021093646", 6650.55}, {"TS_09082021093358", 5477.438}, // 其余时间戳数据... }; // 构造XmlAttribute列表 var xmlDoc = new XmlDocument(); var attrList = new List<XmlAttribute>(); foreach (var kvp in timeStampValues) { var attr = xmlDoc.CreateAttribute(kvp.Key); attr.Value = kvp.Value.ToString(); attrList.Add(attr); } // 初始化PerfMarker对象 var marker1 = new PerfMarker { PerfMarkerName = "Marker1", PercentageIncrease = "21.4171662006946", MaxValue = "6650.55", MinValue = "5477.438", TimeStampAttributes = attrList.ToArray() };
2. 标准序列化生成XML
// 初始化根对象,添加所有PerfMarker var root = new PerfCheckConsidered(); root.PerfMarkers.Add(marker1); // 继续添加其他Marker... // 执行序列化 var serializer = new XmlSerializer(typeof(PerfCheckConsidered)); using (var writer = new StreamWriter("输出文件路径.xml")) { serializer.Serialize(writer, root); }
原类结构问题说明
你原有定义中的 TimeStampToMarkerValues 是列表类型,默认序列化会生成嵌套的子节点结构,无法直接映射为父节点的属性。使用 [XmlAnyAttribute] 特性可以直接将集合内的属性直接挂载到当前 PerfMarker 节点上,完全匹配你需要的XML格式。
内容的提问来源于stack exchange,提问作者Pruthvi Raj
相关产品推荐
相关产品推荐

