C# 中XML的序列化和反序列化
程序员文章站
2022-03-04 14:21:21
...
这是第一篇文章,原本是在新浪微博写的,但是新浪不支持插入代码,在这里再写一遍。但是主要目的还是记录下来,好记性不如烂笔头。
不做过多介绍,直接贴我的东西
生成的xml文件
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<level id="1" filePath="asd">
<animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
<reward type="role" count="9" id="00" />
</level>
<level id="1" filePath="asd">
<animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
<reward type="role" count="9" id="00" />
</level>
<level id="1" filePath="asd">
<animation filePath="asddd" sceneTrigger="aaa" resultTrigger="ss" roleIdTrigger="111" />
<reward type="role" count="9" id="00" />
</level>
</root>
C#model
[XmlType(TypeName = "root")]
public class LevelInfoModel
{
[XmlElementAttribute(ElementName = "level", IsNullable = false)]
public List<LevelInfoItemModel> levels { get; set; }
}
public class LevelInfoItemModel
{
[XmlAttribute]
public string id { set; get; }
[XmlAttribute]
public string filePath { set; get; }
[XmlElementAttribute(ElementName = "animation", IsNullable = true)]
public List<AnimationInfoModel> aniLists { set; get; }
[XmlElementAttribute(ElementName = "reward", IsNullable = true)]
public List<RewardInfoModel> rewLists { set; get; }
}
public class AnimationInfoModel
{
[XmlAttribute]
public string filePath { get; set; }
[XmlAttribute]
public string sceneTrigger { get; set; }
[XmlAttribute]
public string resultTrigger { set; get; }
[XmlAttribute]
public string roleIdTrigger { get; set; }
}
public class RewardInfoModel
{
[XmlAttribute]
public string type { set; get; }
[XmlAttribute]
public int count { set; get; }
[XmlAttribute]
public string id { set; get; }
}
XML的序列化和反序列化
public class SerializeXmlSwitch
{
/// <summary>
/// XML序列化某一类型到指定的文件
/// </summary>
/// <param name="filePath"></param>
/// <param name="obj"></param>
/// <param name="type"></param>
public static void SerializeToXml<T>(string filePath, T obj)
{
try
{
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath))
{
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
xs.Serialize(writer, obj);
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 从某一XML文件反序列化到某一类型
/// </summary>
/// <param name="filePath">待反序列化的XML文件名称</param>
/// <param name="type">反序列化出的</param>
/// <returns></returns>
public static T DeserializeFromXml<T>(string filePath)
{
try
{
if (!System.IO.File.Exists(filePath))
throw new ArgumentNullException(filePath + " not Exists");
using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath))
{
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
T ret = (T)xs.Deserialize(reader);
return ret;
}
}
catch (Exception ex)
{
return default(T);
}
}
}
下面是一些model的序列化标记
- 相关的常用Attribute(命名空间System.Xml.Serialization )
- [XmlRootAttribute("PurchaseOrder", Namespace="http://www.cpandl.com", IsNullable=false)] // 指定根
- [XmlIgnoreAttribute] // 跳过不序列化
- [XmlArrayAttribute("Items")] public OrderedItem[] OrderedItems; // 层次序列化: <Items><OrderedItem.../><OrderedItem.../>..</Items>
- [XmlElementAttribute(ElementName="Link", IsNullable=false)] public Link[] Links; // 平面序列化: <Link ..../><Link .../>...
- [XmlAttribute("Cat")] public string Cat; // 表现为属性<... Cat=.. />
- [XmlElementAttribute(IsNullable=false)] // 表现为节点<Cat>..</cat>
- 相关的全部Attribute(命名空间System.Xml.Serialization )
- XmlAttributes 表示一个特性对象的集合,这些对象控制 XmlSerializer 如何序列化和反序列化对象。
- XmlArrayAttribute 指定 XmlSerializer 应将特定的类成员序列化为 XML 元素数组。
- XmlArrayItemAttribute 指定 XmlSerializer 可以放置在序列化数组中的派生类型。
- XmlArrayItemAttributes 表示 XmlArrayItemAttribute 对象的集合。
- XmlAttributeAttribute 指定 XmlSerializer 应将类成员作为 XML 特性序列化。
- XmlChoiceIdentifierAttribute 指定可以通过使用枚举来进一步消除成员的歧义。
- XmlElementAttribute 在 XmlSerializer 序列化或反序列化包含对象时,指示公共字段或属性表示 XML 元素。
- XmlElementAttributes 表示 XmlElementAttribute 的集合,XmlSerializer 将其用于它重写序列化类的默认方式。
- XmlEnumAttribute 控制 XmlSerializer 如何序列化枚举成员。
- XmlIgnoreAttribute 指示 XmlSerializer 的 Serialize 方法不序列化公共字段或公共读/写属性值。
- XmlIncludeAttribute 允许 XmlSerializer 在它序列化或反序列化对象时识别类型。
- XmlRootAttribute 控制视为 XML 根元素的属性目标的 XML 序列化。
- XmlTextAttribute 当序列化或反序列化包含类时,向 XmlSerializer 指示应将此成员作为 XML 文本处理。
- XmlTypeAttribute 控制当属性目标由 XmlSerializer 序列化时生成的 XML 架构。
- XmlAnyAttributeAttribute 指定成员(返回 XmlAttribute 对象的数组的字段)可以包含任何 XML 属性。
- XmlAnyElementAttribute 指定成员(返回 XmlElement 或 XmlNode 对象的数组的字段)可以包含对象,该对象表示在序列化或反序列化的对象中没有相应成员的所有 XML 元素。
- XmlAnyElementAttributes 表示 XmlAnyElementAttribute 对象的集合。
- XmlAttributeEventArgs 为 UnknownAttribute 事件提供数据。
- XmlAttributeOverrides 允许您在使用 XmlSerializer 序列化或反序列化对象时重写属性、字段和类特性。
- XmlElementEventArgs 为 UnknownElement 事件提供数据。
- XmlNamespaceDeclarationsAttribute 指定目标属性、参数、返回值或类成员包含与 XML 文档中所用命名空间关联的前缀。
- XmlNodeEventArgs 为 UnknownNode 事件提供数据。
- XmlSerializer 将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您得以控制如何将对象编码到 XML 中。
- XmlSerializerNamespaces 包含 XmlSerializer 用于在 XML 文档实例中生成限定名的 XML 命名空间和前缀。
- XmlTypeMapping 包含从一种类型到另一种类型的映射。