C#对象XML序列化

时间:2022-08-15 05:46:13

1.Xml序列化操作类

.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象。

以下代码仅供参考:

    public class XmlSerializerTest
{
public static void SaveToXml(string file, object data)
{
XmlSerializer serializer = new XmlSerializer(data.GetType());
using (XmlTextWriter fs = new XmlTextWriter(file, Encoding.UTF8)) // 如果输出中文,记得字符集
{
fs.Formatting = System.Xml.Formatting.Indented; // 输出后保留换行符等。默认为None,即过滤换行符等
serializer.Serialize(fs, data);
}
}
public static object LoadFromXml(string file, Type type)
{
object value = null;
XmlSerializer serializer = new XmlSerializer(type);
using (XmlTextReader fs = new XmlTextReader(file))
{
value = serializer.Deserialize(fs);
}
return value;
}
}

2.对象与Xml的关系

2.1对象的默认设置

输出对象时,仅输出Public标识的属性,如下代码:(此处仅说明默认情况,下面会有介绍xml标记)

    public class TestObject
{
public string ID { set; get; }
public string Name { set; get; }
public string Desc { set; get; }
public List<string> Tags { set; get; }
public List<ChildObject> Children { set; get; }
} public class ChildObject
{
public string ID { set; get; }
public string Name { set; get; }
public string Desc { set; get; }
}

输出后,文件内容是:

<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>1</ID>
<Name>测试对象</Name>
<Desc>此为描述
此处换行显示</Desc>
<Tags>
<string>标签A</string>
<string>标签B</string>
<string>标签C</string>
</Tags>
<Children>
<ChildObject>
<ID>1-1</ID>
<Name>子A</Name>
<Desc>此处
换行</Desc>
</ChildObject>
<ChildObject>
<ID>1-2</ID>
<Name>子B</Name>
<Desc>此处不换行</Desc>
</ChildObject>
</Children>
</TestObject>

2.2对象的序列化标记

[XmlRootAttribute("TestObject", Namespace = "Sy4w.Test", IsNullable = false)]
public class TestObject                       // 序列化此类时,定义为Xml根节点信息

[XmlAttribute("ID")]
public string ID { set; get; }               //  作为TestObject标签的属性。如:<ClassID="..." />

[XmlElementAttribute("Desc", IsNullable = false)]
public string Desc { set; get; }            //  作为类标签的内容。如<Class>...</Class>

[XmlElementAttribute("Tags", IsNullable = false)]
public List<string> Tags { set; get; }  //   作为类标签的子节点。如<Class><Tags>...</Tags></Class>

[XmlArrayAttribute("Children")]
public List<ChildObject> Children { set; get; }  // 作为类标签的多级子标签。如<Class><Children><ChildObject>...</ChildObject></Children></Class>

[XmlIgnoreAttribute]
public string Name { set; get; }           //   此属性忽略

用代码感受下吧

    [XmlRootAttribute("TestObject", Namespace = "Sy4w.Test", IsNullable = false)]
public class TestObject
{
[XmlAttribute("ID")]
public string ID { set; get; } [XmlIgnoreAttribute]
public string Name { set; get; }
[XmlElementAttribute("Desc", IsNullable = false)]
public string Desc { set; get; }
[XmlElementAttribute("Tags", IsNullable = false)]
public List<string> Tags { set; get; } [XmlArrayAttribute("Children")]
public List<ChildObject> Children { set; get; }
} public class ChildObject
{
[XmlAttribute("ID")]
public string ID { set; get; }
[XmlIgnoreAttribute]
public string Name { set; get; }
[XmlElementAttribute("Desc", IsNullable = true)]
public string Desc { set; get; }
}

生成的Xml文件示例:

<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="1" xmlns="Sy4w.Test">
<Desc>此为描述
此处换行显示</Desc>
<Tags>标签A</Tags>
<Tags>标签B</Tags>
<Tags>标签C</Tags>
<Children>
<ChildObject ID="1-1">
<Desc>此处
换行</Desc>
</ChildObject>
<ChildObject ID="1-2">
<Desc>此处不换行</Desc>
</ChildObject>
</Children>
</TestObject>