七色彩虹

勤奋、务实、团结、创新

导航

C# XmlSerializer(转载)

Posted on 2010-11-16 12:43  aadfe  阅读(6341)  评论(0编辑  收藏  举报
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

主要方法:

复制 保存