亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#正反序列化XML文件示例(xml序列化)

2020-01-24 02:46:03
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Serialization;
using System.IO;
using System;

namespace GlobalTimes.Framework
{
    /// <summary>
    /// XML文本通用解釋器
    /// </summary>
    public class XmlHelper
    {
        private const string EncodePattern = "<[^>]+?encoding=/"(?<enc>[^<>//s]+)/"[^>]*?>";
        private static readonly Encoding DefEncoding = Encoding.GetEncoding("gb2312");
        private static readonly Regex RegRoot = new Regex("<(//w+?)[ >]", RegexOptions.Compiled);
        private static readonly Regex RegEncode = new Regex(EncodePattern,
                                                            RegexOptions.Compiled | RegexOptions.IgnoreCase);
        private static readonly Dictionary<string, XmlSerializer> Parsers = new Dictionary<string, XmlSerializer>();
        #region 解析器

        static Encoding GetEncoding(string input)
        {
            var match = RegEncode.Match(input);
            if (match.Success)
            {
                try
                {
                    return Encoding.GetEncoding(match.Result("${enc}"));
                }
// ReSharper disable EmptyGeneralCatchClause
                catch (Exception)
// ReSharper restore EmptyGeneralCatchClause
                {
                }
            }
            return DefEncoding;
        }

        /// <summary>
        /// 解析XML文件
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="fileName">文件名</param>
        /// <returns>類的實例</returns>
        public T ParseFile<T>(string fileName) where T : class, new()
        {
            var info = new FileInfo(fileName);
            if (!info.Extension.Equals(".xml", StringComparison.CurrentCultureIgnoreCase) || !info.Exists)
            {
                throw new ArgumentException("輸入的文件名有誤!");
            }
            string body;
            var tempFileName = PathHelper.PathOf("temp", Guid.NewGuid().ToString().Replace("-", "") + ".xml");
            var fi = new FileInfo(tempFileName);
            var di = fi.Directory;
            if (di != null && !di.Exists)
            {
                di.Create();
            }
            File.Copy(fileName, tempFileName);
            using (Stream stream = File.Open(tempFileName, FileMode.Open, FileAccess.Read))
            {
                using (TextReader reader = new StreamReader(stream, DefEncoding))
                {
                    body = reader.ReadToEnd();
                }
            }
            File.Delete(tempFileName);
            var enc = GetEncoding(body);
            if (!Equals(enc, DefEncoding))
            {
                var data = DefEncoding.GetBytes(body);
                var dest = Encoding.Convert(DefEncoding, enc, data);
                body = enc.GetString(dest);
            }
            return Parse<T>(body, enc);
        }

        /// <summary>
        /// 將對象序列化為XML文件
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <param name="obj">對象</param>
        /// <returns></returns>
        /// <exception cref="ArgumentException">文件名錯誤異常</exception>
        public bool SaveFile(string fileName, object obj)
        {
            return SaveFile(fileName, obj, DefEncoding);
        }

        /// <summary>
        /// 將對象序列化為XML文件
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <param name="obj">對象</param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException">文件名錯誤異常</exception>
        public bool SaveFile(string fileName, object obj,Encoding encoding)
        {
            var info = new FileInfo(fileName);
            if (!info.Extension.Equals(".xml", StringComparison.CurrentCultureIgnoreCase))
            {
                throw new ArgumentException("輸入的文件名有誤!");
            }
            if (obj == null) return false;
            var type = obj.GetType();
            var serializer = GetSerializer(type);

            using (Stream stream = File.Open(fileName, FileMode.Create, FileAccess.Write))
            {
                using (TextWriter writer = new StreamWriter(stream, encoding))
                {
                    serializer.Serialize(writer, obj);
                }
            }
            return true;
        }
        static XmlSerializer GetSerializer(Type type)
        {
            var key = type.FullName;
            XmlSerializer serializer;
            var incl = Parsers.TryGetValue(key, out serializer);
            if (!incl || serializer == null)
            {
                var rootAttrs = new XmlAttributes { XmlRoot = new XmlRootAttribute(type.Name) };
                var attrOvrs = new XmlAttributeOverrides();
                attrOvrs.Add(type, rootAttrs);
                try
                {
                    serializer = new XmlSerializer(type, attrOvrs);
                }
                catch (Exception e)
                {
                    throw new Exception("類型聲明錯誤!" + e);
                }
                Parsers[key] = serializer;
            }
            return serializer;
        }
        /// <summary>
        /// 解析文本
        /// </summary>
        /// <typeparam name="T">需要解析的類</typeparam>
        /// <param name="body">待解析文本</param>
        /// <returns>類的實例</returns>
        public T Parse<T>(string body) where T : class, new()
        {
            var encoding = GetEncoding(body);
            return Parse<T>(body, encoding);
        }

        /// <summary>
        /// 解析文本
        /// </summary>
        /// <typeparam name="T">需要解析的類</typeparam>
        /// <param name="body">待解析文本</param>
        /// <param name="encoding"></param>
        /// <returns>類的實例</returns>
        public T Parse<T>(string body, Encoding encoding) where T : class, new()
        {
            var type = typeof (T);
            var rootTagName = GetRootElement(body);

            var key = type.FullName;
            if (!key.Contains(rootTagName))
            {
                throw new ArgumentException("輸入文本有誤!key:" + key + "/t/troot:" + rootTagName);
            }

            var serializer = GetSerializer(type);
            object obj;
            using (Stream stream = new MemoryStream(encoding.GetBytes(body)))
            {
                obj = serializer.Deserialize(stream);
            }
            if (obj == null) return null;
            try
            {
                var rsp = (T) obj;
                return rsp;
            }
            catch (InvalidCastException)
            {
                var rsp = new T();
                var pisr = typeof (T).GetProperties();
                var piso = obj.GetType().GetProperties();
                foreach (var info in pisr)
                {
                    var info1 = info;
                    foreach (var value in from propertyInfo in piso where info1.Name.Equals(propertyInfo.Name) select propertyInfo.GetValue(obj, null))
                    {
                        info.SetValue(rsp, value, null);
                        break;
                    }
                }
                return rsp;
            }
        }

        private static XmlSerializer BuildSerializer(Type type)
        {
            var rootAttrs = new XmlAttributes { XmlRoot = new XmlRootAttribute(type.Name) };
            var attrOvrs = new XmlAttributeOverrides();
            attrOvrs.Add(type, rootAttrs);
            try
            {
                return new XmlSerializer(type, attrOvrs);
            }
            catch (Exception e)
            {
                throw new Exception("類型聲明錯誤!" + e);
            }
        }

        /// <summary>
        /// 解析未知類型的XML內容
        /// </summary>
        /// <param name="body">Xml文本</param>
        /// <param name="encoding">字符編碼</param>
        /// <returns></returns>
        public object ParseUnknown(string body, Encoding encoding)
        {
            var rootTagName = GetRootElement(body);
            var array = AppDomain.CurrentDomain.GetAssemblies();
            Type type = null;
            foreach (var assembly in array)
            {
                type = assembly.GetType(rootTagName, false, true);
                if (type != null) break;
            }
            if (type == null)
            {
                Logger.GetInstance().Warn("加載 {0} XML類型失敗! ", rootTagName);
                return null;
            }
            var serializer = GetSerializer(type);
            object obj;
            using (Stream stream = new MemoryStream(encoding.GetBytes(body)))
            {
                obj = serializer.Deserialize(stream);
            }

            var rsp = obj;
            return rsp;
        }
        /// <summary>
        /// 用XML序列化對象
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string Serialize(object obj)
        {
            if (obj == null) return string.Empty;
            var type = obj.GetType();
            var serializer = GetSerializer(type);
            var builder = new StringBuilder();
            using (TextWriter writer = new StringWriter(builder))
            {
                serializer.Serialize(writer, obj);
            }
            return builder.ToString();
        }
        #endregion

        /// <summary>
        /// 獲取XML響應的根節點名稱
        /// </summary>
        private static string GetRootElement(string body)
        {
            var match = RegRoot.Match(body);
            if (match.Success)
            {
                return match.Groups[1].ToString();
            }
            throw new Exception("Invalid XML format!");
        }

    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
插插插亚洲综合网| 国产精品美女久久| 久久高清视频免费| 亚洲综合一区二区不卡| 久久久久亚洲精品| 欧美一级黑人aaaaaaa做受| 亚洲第一精品电影| 欧美性色xo影院| 欧美福利在线观看| 欧美俄罗斯性视频| 7777精品久久久久久| 日av在线播放中文不卡| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲摸下面视频| 欧美激情综合亚洲一二区| 欧美最顶级丰满的aⅴ艳星| 精品久久久久久久久久| 91情侣偷在线精品国产| 精品国产乱码久久久久久婷婷| 韩曰欧美视频免费观看| 亚洲午夜色婷婷在线| 成人做爽爽免费视频| 久久在线免费视频| 亚洲精品电影网在线观看| 欧美性极品xxxx娇小| 欧美午夜片在线免费观看| 久久男人资源视频| 国产精品v日韩精品| 国产精品一区二区三区在线播放| 不用播放器成人网| 久久精品99久久久香蕉| 日本久久久久久久久| 久久综合88中文色鬼| 亚洲精品成人网| 91欧美日韩一区| 亚洲免费视频网站| 欧美日韩美女在线观看| 欧美成人午夜免费视在线看片| 97在线视频精品| 欧美刺激性大交免费视频| 亚洲日韩欧美视频一区| www.亚洲天堂| 亚洲国产私拍精品国模在线观看| 日韩av免费网站| 久久深夜福利免费观看| 国产精品视频999| 精品国产自在精品国产浪潮| 欧美日韩亚洲系列| 久久久精品视频成人| 国产精品ⅴa在线观看h| 成人免费激情视频| 亚洲精品视频免费| 中文字幕在线看视频国产欧美在线看完整| 国产精品色婷婷视频| 成人欧美在线观看| 欧美激情xxxxx| 岛国av在线不卡| 日本不卡视频在线播放| 久久久久久九九九| 成人乱人伦精品视频在线观看| 亚洲自拍欧美色图| 欧美多人乱p欧美4p久久| 色伦专区97中文字幕| www日韩中文字幕在线看| 国产成人激情小视频| 日韩欧美精品网址| 91精品久久久久久久久久| 亚洲精品少妇网址| 欧美丰满片xxx777| 久久国产精品电影| 在线电影av不卡网址| 亚洲xxxx视频| 91中文字幕在线观看| 精品亚洲va在线va天堂资源站| 日本韩国欧美精品大片卡二| 欧美日韩国产一区中文午夜| 日本精品视频在线观看| 国产视频在线一区二区| 亚洲精品乱码久久久久久金桔影视| 91高清视频在线免费观看| 黄网站色欧美视频| 欧美激情视频在线观看| 精品国产1区2区| 亚洲精品视频免费| 色偷偷av一区二区三区| 91夜夜揉人人捏人人添红杏| 国产精品99久久久久久人| 97高清免费视频| 亚洲欧美国产高清va在线播| 91精品国产综合久久久久久久久| 日韩精品欧美激情| 久久91精品国产91久久跳| 亚洲国产婷婷香蕉久久久久久| 中文字幕久精品免费视频| 久久综合国产精品台湾中文娱乐网| 日韩专区中文字幕| 久热精品视频在线观看一区| 日韩av手机在线观看| 国产成人黄色av| 国产日韩中文字幕| 亚洲区中文字幕| 国产区精品视频| 少妇高潮久久久久久潘金莲| 久久五月情影视| 亚洲人线精品午夜| 自拍亚洲一区欧美另类| 亚洲一区av在线播放| 亚洲欧美日韩精品| 国产69精品久久久久99| 高跟丝袜欧美一区| 国产精品视频免费观看www| 成人a在线视频| 欧美日韩性视频在线| 97成人精品视频在线观看| 精品一区精品二区| 欧美视频在线免费看| 亚洲免费视频网站| 欧美激情18p| 国产有码一区二区| 国产精品日日做人人爱| 亚洲iv一区二区三区| 美女视频黄免费的亚洲男人天堂| 国产欧美 在线欧美| 中文字幕精品影院| 欧美视频在线视频| 精品美女永久免费视频| 欧美在线免费视频| 日本久久91av| 国产成人亚洲精品| 中文字幕日韩精品在线观看| 97久久精品在线| 亚洲视频网站在线观看| 国产一区二区久久精品| 日韩在线视频二区| 精品中文字幕视频| 亚洲视频在线免费看| 欧美性猛交xxxx免费看漫画| 日韩大陆毛片av| 日韩av电影手机在线观看| 91av免费观看91av精品在线| 国产精品免费观看在线| 欧美有码在线观看视频| 久久久亚洲精品视频| 日韩美女av在线免费观看| 国产精品视频免费观看www| 欧美精品www| 欧美成人精品一区| 日产精品久久久一区二区福利| 国产精品扒开腿做| 精品人伦一区二区三区蜜桃网站| 亚洲国产日韩欧美在线99| 91久久精品国产| 日韩欧美a级成人黄色| 日韩精品在线看| 亚洲精品日韩丝袜精品| 国外视频精品毛片| 中文字幕日韩综合av| 中文字幕综合一区| 国产一区在线播放| 91精品久久久久久久久久另类| 久久久国产精品免费| 久久69精品久久久久久久电影好| 久久久久国产精品免费网站| 在线不卡国产精品|