如何将其他类的列表导入自定义Serializable类完成XML序列化?
实现方案
1. 先修改可序列化类定义,添加对应列表属性
XML序列化要求参与序列化的属性为公共可读写类型,你需要在ToSerialize类中定义和你原有列表类型完全匹配的属性,示例代码如下:
[Serializable] public class ToSerialize { // 此处的YourItemType替换为你列表的实际元素类型 // 初始化空列表可以避免序列化时出现 null 引用异常 [XmlArray("CustomListName"), XmlArrayItem("CustomItemName")] public List<YourItemType> TargetList { get; set; } = new List<YourItemType>(); // 其余原有代码保留即可 }
如果需要调整列表在XML中的节点名称,可以通过XmlArray、XmlArrayItem特性自定义,不需要自定义的话可以去掉这两个特性。
2. 转移独立类中的列表数据
直接将独立类中的列表实例赋值给ToSerialize类的对应属性即可,示例代码如下:
// 实例化待序列化的对象 ToSerialize serializeInstance = new ToSerialize(); // 假设你的独立类实例为otherClassObj,其内部存储的列表属性为SourceList // 直接赋值:两者会引用同一个列表实例,后续修改任意一边的列表元素都会同步生效 serializeInstance.TargetList = otherClassObj.SourceList; // 如果需要两个列表完全独立互不影响,可以做深拷贝,示例如下: // serializeInstance.TargetList = otherClassObj.SourceList.Select(item => new YourItemType // { // Prop1 = item.Prop1, // Prop2 = item.Prop2, // // 其余属性依次拷贝 // }).ToList();
赋值完成后你就可以直接用serializeInstance做XML序列化操作。
注意事项
- 列表的元素类型
YourItemType需要满足XML序列化要求:必须包含无参公共构造函数,需要序列化的属性/字段设为公共访问权限 [Serializable]特性是为二进制序列化、RPC序列化场景准备的,XML序列化不需要该特性也能正常工作,保留也不会产生冲突- 如果原有列表是独立类的私有字段,你需要先在独立类中为该列表添加公共访问属性,或者提供公共方法返回列表实例,才能在外部获取到列表值做赋值
内容的提问来源于stack exchange,提问作者damnDAN
相关产品推荐
相关产品推荐

