原文:http://www.cnblogs.com/nhxy/archive/2010/11/16/1878409.html
本文描述如何使用CLR中的StringWriter,XmlSerializer将对象, 对象集合序列化为Xml格式的字符串, 同时描述如何进行反序列化。看代码就能理解,直接上代码了:
案例1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
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);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
[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 ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TestOne();
Console.WriteLine();
TestTwo();
Console.WriteLine();
TestThree();
Console.WriteLine();
TestFour();
Console.ReadLine();
}
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);
}
}
}
}
运行结果:
案例2:
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";
}
}
[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()
{
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
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();
LoadAsXmlFormat(jbc, "CarData.xml");
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 Load as XML Format
static void LoadAsXmlFormat(object objGraph, string fileName)
{
XmlSerializer a = new XmlSerializer(objGraph.GetType());
using (StreamReader fStream = new StreamReader(fileName))
{
JamesBondCar b = a.Deserialize(fStream) as JamesBondCar;
Console.WriteLine("=> Loaded car in XML format!");
Console.WriteLine("Can this car fly? : {0}", b.canFly);
}
}
#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
}
}
运行结果:
好了,祝进步。
每天进步一点点。