using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Xml; using System.Xml.Serialization; namespace ConsoleApplication2 { public class SimpleSerializer { /// <summary> /// 序列化对象 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="t">对象</param> /// <returns></returns> public static string Serialize<T>(T t) { using (StringWriter sw = new StringWriter()) { XmlSerializer xz = new XmlSerializer(t.GetType()); xz.Serialize(sw, t); return sw.ToString(); } } /// <summary> /// 反序列化为对象 /// </summary> /// <param name="type">对象类型</param> /// <param name="s">对象序列化后的Xml字符串</param> /// <returns></returns> public static object Deserialize(Type type, string s) { using (StringReader sr = new StringReader(s)) { XmlSerializer xz = new XmlSerializer(type); return xz.Deserialize(sr); } } } } 定义一个用于测试的实体类: UserInfo using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; namespace ConsoleApplication2 { [Serializable] public class UserInfo { private int m_UserId; [XmlElement("userId")] public int UserId { get { return m_UserId; } set { m_UserId = value; } } private string m_UserName; [XmlElement("userName")] public string UserName { get { return m_UserName; } set { m_UserName = value; } } } } 编写测试子程序: using System; using System.Collections.Generic; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Program.TestOne(); Console.WriteLine(string.Empty); Program.TestTwo(); Console.WriteLine(string.Empty); Program.TestThree(); Console.WriteLine(string.Empty); Program.TestFour(); } public static void TestOne() { UserInfo info = new UserInfo() { UserId = 1, UserName = "Guozhijian" }; Console.WriteLine(SimpleSerializer.Serialize<UserInfo>(info)); } public static void TestTwo() { List<UserInfo> list = new List<UserInfo>(); list.Add(new UserInfo() { UserId = 1, UserName = "Guozhijian" }); list.Add(new UserInfo() { UserId = 2, UserName = "Zhenglanzhen" }); Console.WriteLine(SimpleSerializer.Serialize<List<UserInfo>>(list)); } public static void TestThree() { string s = SimpleSerializer.Serialize<UserInfo>(new UserInfo() { UserId = 1, UserName = "Guozhijian" }); UserInfo info = SimpleSerializer.Deserialize(typeof(UserInfo), s) as UserInfo; Console.WriteLine(info.UserId.ToString() + ", " + info.UserName); } public static void TestFour() { List<UserInfo> list = new List<UserInfo>(); list.Add(new UserInfo() { UserId = 1, UserName = "Guozhijian" }); list.Add(new UserInfo() { UserId = 2, UserName = "Zhenglanzhen" }); string s = SimpleSerializer.Serialize<List<UserInfo>>(list); List<UserInfo> newList = SimpleSerializer.Deserialize(typeof(List<UserInfo>), s) as List<UserInfo>; foreach (var info in newList) { Console.WriteLine(info.UserId.ToString() + ", " + info.UserName); } } } } 输出结果为: C:\WINDOWS\system32\cmd.exe 复制 保存 <?xml version="1.0" encoding="utf-16"?> <UserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http: //www.w3.org/2001/XMLSchema"> <userId>1</userId> <userName>Guozhijian</userName> </UserInfo> <?xml version="1.0" encoding="utf-16"?> <ArrayOfUserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema"> <UserInfo> <userId>1</userId> <userName>Guozhijian</userName> </UserInfo> <UserInfo> <userId>2</userId> <userName>Zhenglanzhen</userName> </UserInfo> </ArrayOfUserInfo> 1, Guozhijian 1, Guozhijian 2, Zhenglanzhen 示例二 //Radio.cs using System; using System.Collections.Generic; using System.Text; namespace SimpleSerialize { [Serializable] public class Radio { public bool hasTweeters; public bool hasSubWoofers; public double[] stationPresets; [NonSerialized] public string radioID = "XF-552RR6"; } } //Cars.cs using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; namespace SimpleSerialize { [Serializable] public class Car { public Radio theRadio = new Radio(); public bool isHatchBack; } [Serializable, XmlRoot(Namespace = "http://www.intertech.com")] public class JamesBondCar : Car { [XmlAttribute] public bool canFly; [XmlAttribute] public bool canSubmerge; public JamesBondCar(bool skyWorthy, bool seaWorthy) { canFly = skyWorthy; canSubmerge = seaWorthy; } // The XmlSerializer demands a default constructor! public JamesBondCar() { } } } //Program.cs using System; using System.Collections.Generic; using System.Text; using System.IO; // For the formatters. using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Xml.Serialization; namespace SimpleSerialize { class Program { static void Main(string[] args) { Console.WriteLine("***** Fun with Object Serialization *****\n"); // Make a JamesBondCar and set state. JamesBondCar jbc = new JamesBondCar(); jbc.canFly = true; jbc.canSubmerge = false; jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 }; jbc.theRadio.hasTweeters = true; // Now save / Load the car to a specific file. SaveAsBinaryFormat(jbc, "CarData.dat"); LoadFromBinaryFile("CarData.dat"); SaveAsSoapFormat(jbc, "CarData.soap"); SaveAsXmlFormat(jbc, "CarData.xml"); SaveListOfCars(); SaveListOfCarsAsBinary(); Console.ReadLine(); } #region Save / Load as Binary Format static void SaveAsBinaryFormat(object objGraph, string fileName) { // Save object to a file named CarData.dat in binary. BinaryFormatter binFormat = new BinaryFormatter(); using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { binFormat.Serialize(fStream, objGraph); } Console.WriteLine("=> Saved car in binary format!"); } static void LoadFromBinaryFile(string fileName) { BinaryFormatter binFormat = new BinaryFormatter(); // Read the JamesBondCar from the binary file. using (Stream fStream = File.OpenRead(fileName)) { JamesBondCar carFromDisk = (JamesBondCar)binFormat.Deserialize(fStream); Console.WriteLine("Can this car fly? : {0}", carFromDisk.canFly); } } #endregion #region Save as SOAP Format // Be sure to import System.Runtime.Serialization.Formatters.Soap // and reference System.Runtime.Serialization.Formatters.Soap.dll. static void SaveAsSoapFormat(object objGraph, string fileName) { // Save object to a file named CarData.soap in SOAP format. SoapFormatter soapFormat = new SoapFormatter(); using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { soapFormat.Serialize(fStream, objGraph); } Console.WriteLine("=> Saved car in SOAP format!"); } #endregion #region Save as XML Format static void SaveAsXmlFormat(object objGraph, string fileName) { // Save object to a file named CarData.xml in XML format. XmlSerializer xmlFormat = new XmlSerializer(typeof(JamesBondCar), new Type[] { typeof(Radio), typeof(Car) }); using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { xmlFormat.Serialize(fStream, objGraph); } Console.WriteLine("=> Saved car in XML format!"); } #endregion #region Save collection of cars static void SaveListOfCars() { // Now persist a List<> of JamesBondCars. List<JamesBondCar> myCars = new List<JamesBondCar>(); myCars.Add(new JamesBondCar(true, true)); myCars.Add(new JamesBondCar(true, false)); myCars.Add(new JamesBondCar(false, true)); myCars.Add(new JamesBondCar(false, false)); using (Stream fStream = new FileStream("CarCollection.xml", FileMode.Create, FileAccess.Write, FileShare.None)) { XmlSerializer xmlFormat = new XmlSerializer(typeof(List<JamesBondCar>), new Type[] { typeof(JamesBondCar), typeof(Car), typeof(Radio) }); xmlFormat.Serialize(fStream, myCars); } Console.WriteLine("=> Saved list of cars!"); } static void SaveListOfCarsAsBinary() { // Save ArrayList object (myCars) as binary. List<JamesBondCar> myCars = new List<JamesBondCar>(); BinaryFormatter binFormat = new BinaryFormatter(); using (Stream fStream = new FileStream("AllMyCars.dat", FileMode.Create, FileAccess.Write, FileShare.None)) { binFormat.Serialize(fStream, myCars); } Console.WriteLine("=> Saved list of cars in binary!"); } #endregion } }
本文描述如何使用CLR中的StringWriter,XmlSerializer将对象, 对象集合序列化为Xml格式的字符串, 同时描述如何进行反序列化.
C#版本: C# 3.0
开发环境: VS 2008
主要方法:
复制 保存