c# xml序列化和反序列化

本文介绍了一种实现对象序列化与反序列化的实用方法,通过C#代码示例展示了如何将对象转换为XML字符串及反之亦然。具体包括序列化对象到内存流、从XML字符串或流反序列化对象等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先解释一下名次含义:

序列化将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

反序列化与之相反将可存储或可传输的形式转换为对象的状态信息。这里不再多说

直接上代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace NewXml
{
    /// <summary>
    /// Xml序列化与反序列化
    /// </summary>
    public class XmlUtil
    {
        #region 反序列化
        /// <summary>
        /// Xml反序列化成T
        /// </summary>
        /// <param name="type">类型</param>
        /// <param name="xml">XML字符串</param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(string xml) where T:class,new()
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer xmldes = new XmlSerializer(typeof(T));
                    return xmldes.Deserialize(sr) as T;
                }
            }
            catch (Exception)
            {
                return default(T);
            }
        }
        /// <summary>
        /// Xml Stream反序列化成T
        /// </summary>
        /// <param name="type"></param>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T XmlDeserialize<T>(Stream stream) where T:class,new()
        {
            try
            {
                XmlSerializer xmldes = new XmlSerializer(typeof(T));
                return xmldes.Deserialize(stream) as T;
            }
            catch
            {
                return default(T);
            }
        }
        #endregion

        #region 序列化
        /// <summary>
        /// object序列化成Xml字符串
        /// </summary>
        /// <param name="type">类型</param>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        public static string XmlSerializer(object t)
        {
            MemoryStream Stream = new MemoryStream();
            XmlSerializer xml = new XmlSerializer(t.GetType());
            try
            {
                //序列化对象
                xml.Serialize(Stream, t);
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            Stream.Position = 0;
            StreamReader sr = new StreamReader(Stream);
            string str = sr.ReadToEnd();

            sr.Dispose();
            Stream.Dispose();

            return str;
        }

        #endregion
    }
}

2.使用方法:

List<Student> stu1 = new List<Student> 
            { 
                new Student{Name = "okbase", Age = 10},
                new Student{Name = "张三", Age = 15},
                new Student{Name = "李四", Age = 20},
            };
            string xml = XmlUtil.XmlSerializer(stu1);
            Console.WriteLine(xml);
            stu1 = XmlUtil.XmlDeserialize<List<Student>>(xml);
            foreach (var stu in stu1)
            {
                Console.WriteLine(stu.Name);
            }

普通对象,集合,datatable等均可以使用进行序列化,反序列化。

DataTable序列化:

 DataTable dt = new DataTable("mytable");   // 必须指明DataTable名称
            dt.Columns.Add("Dosage", typeof(int));
            dt.Columns.Add("Drug", typeof(string));
            dt.Columns.Add("Patient", typeof(string));
            dt.Columns.Add("Date", typeof(DateTime));
            // 添加行
            dt.Rows.Add(25, "Indocin", "David", DateTime.Now);
            dt.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
            dt.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
            dt.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
            dt.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
            // 序列化
            string xml = XmlUtil.XmlSerializer(dt);
            Console.Write(xml);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值