伊莉討論區

標題: 序列化與反序列化,JSON、XML,可擴充其他格式 [打印本頁]

作者: sam30525sam    時間: 2015-1-6 11:52 AM     標題: 序列化與反序列化,JSON、XML,可擴充其他格式

本帖最後由 sam30525sam 於 2015-1-6 05:30 PM 編輯

最近有點忙,所以有一段時間沒上來版上看看。分享一下我自己寫的一個小工具跟概念。

文章有點長,如果要看的話麻煩請看完,不然會一知半解。
另外,此文章建議熟悉物件導向的人。

另外此文章分享於伊莉,如要轉載請附上此文網址並通知作者,謝謝。

一、程式名稱:
json與xml序列化與反序列化,可擴充其他格式

二、程式架構:
主要分為兩種大方向
1. DataSourceForma:
(1) IDataSourceFormatBase.cs
(2) DataSourceFormatBase.cs
(3) DataSourceJson.cs
(4) DataSourceXml.cs
2. Converter
(1) IConverter.cs
(2) Converter.cs
(3) ConverterType.cs

三、程式碼
1.(1) IDataSourceFormatBase
  1.     public interface IDataSourceFormatBase
  2.     {
  3.         /// <summary>
  4.         /// 序列化
  5.         /// </summary>
  6.         /// <typeparam name="T">序列化型別</typeparam>
  7.         /// <param name="inObject">序列化型別的物件</param>
  8.         /// <returns>序列化字串</returns>
  9.         string Serialize<T>(T inObject) where T : class;

  10.         /// <summary>
  11.         /// 反序列化
  12.         /// </summary>
  13.         /// <typeparam name="T">反序列化型別</typeparam>
  14.         /// <param name="inSource">來源字串</param>
  15.         /// <returns>反序列化型別的物件</returns>
  16.         T Deserialize<T>(String inSource) where T : class;
  17.     }
複製代碼
1.(2) DataSourceFormatBase
  1.     public abstract class DataSourceFormatBase : IDataSourceFormatBase
  2.     {
  3.         /// <summary>
  4.         /// 序列化
  5.         /// </summary>
  6.         /// <typeparam name="T">序列化型別</typeparam>
  7.         /// <param name="inObject">序列化型別的物件</param>
  8.         /// <returns>序列化字串</returns>
  9.         public abstract string Serialize<T>(T inObject) where T : class;

  10.         /// <summary>
  11.         /// 反序列化
  12.         /// </summary>
  13.         /// <typeparam name="T">反序列化型別</typeparam>
  14.         /// <param name="inSource">來源字串</param>
  15.         /// <returns>反序列化型別的物件</returns>
  16.         public abstract T Deserialize<T>(string inSource) where T : class;
  17.     }
複製代碼
1.(3) DataSourceJson.cs
  1.     public class DataSourceJson : DataSourceFormatBase
  2.     {
  3.         /// <summary>
  4.         /// Json序列化
  5.         /// </summary>
  6.         /// <typeparam name="T">序列化型別</typeparam>
  7.         /// <param name="inObject">序列化型別的物件</param>
  8.         /// <returns>序列化字串</returns>
  9.         public override string Serialize<T>(T inObject)
  10.         {
  11.             return JsonConvert.SerializeObject(inObject);
  12.         }

  13.         /// <summary>
  14.         /// Json反序列化
  15.         /// </summary>
  16.         /// <typeparam name="T">反序列化型別</typeparam>
  17.         /// <param name="inSource">來源字串</param>
  18.         /// <returns>反序列化型別的物件</returns>
  19.         public override T Deserialize<T>(string inSource)
  20.         {
  21.             return JsonConvert.DeserializeObject<T>(inSource);
  22.         }
  23.     }
複製代碼
1.(4) DataSourceXml.cs
  1.    public class DataSourceXml : DataSourceFormatBase
  2.     {
  3.         /// <summary>
  4.         /// Xml序列化
  5.         /// </summary>
  6.         /// <typeparam name="T">序列化型別</typeparam>
  7.         /// <param name="inObject">序列化型別的物件</param>
  8.         /// <returns>序列化字串</returns>
  9.         public override string Serialize<T>(T inObject)
  10.         {
  11.             using (StringWriter writer = new StringWriter())
  12.             {
  13.                 XmlSerializer xml = new XmlSerializer(typeof(T));
  14.                 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] { new XmlQualifiedName(string.Empty, string.Empty) });

  15.                 xml.Serialize(writer, inObject, namespaces);
  16.                 return writer.ToString();
  17.             }
  18.         }

  19.         /// <summary>
  20.         /// Xml反序列化
  21.         /// </summary>
  22.         /// <typeparam name="T">反序列化型別</typeparam>
  23.         /// <param name="inSource">來源字串</param>
  24.         /// <returns>反序列化型別的物件</returns>
  25.         public override T Deserialize<T>(string inSource)
  26.         {
  27.             using (StringReader reader = new StringReader(inSource))
  28.             {
  29.                 XmlSerializer xml = new XmlSerializer(typeof(T));
  30.                 return xml.Deserialize(reader) as T;
  31.             }
  32.         }
  33.     }
複製代碼
2.(1) IConverter.cs
  1.     interface IConverter
  2.     {
  3.         /// <summary>
  4.         /// 序列化
  5.         /// </summary>
  6.         /// <typeparam name="T">序列化型別</typeparam>
  7.         /// <param name="inObject">序列化型別的物件</param>
  8.         /// <returns>序列化字串</returns>
  9.         string Serialize<T>(T inObject) where T : class;

  10.         /// <summary>
  11.         /// 反序列化
  12.         /// </summary>
  13.         /// <typeparam name="T">反序列化型別</typeparam>
  14.         /// <param name="inSource">來源字串</param>
  15.         /// <returns>反序列化型別的物件</returns>
  16.         T Deserialize<T>(String inSource) where T : class;
  17.     }
複製代碼
2.(2) Converter.cs
  1.     public class Converter : IConverter
  2.     {
  3.         private DataSourceFormatBase Format { get; set; }

  4.         public Converter(ConverterType inType)
  5.         {
  6.             switch (inType)
  7.             {
  8.                 case ConverterType.Xml:
  9.                     this.Format = new DataSourceXml();
  10.                     break;

  11.                 case ConverterType.Json:
  12.                     this.Format = new DataSourceJson();
  13.                     break;

  14.                 default:
  15.                     this.Format = null;
  16.                     break;
  17.             }
  18.         }

  19.         public string Serialize<T>(T inObject) where T : class
  20.         {
  21.             return this.Format.Serialize<T>(inObject);
  22.         }

  23.         public T Deserialize<T>(string inSource) where T : class
  24.         {
  25.             return this.Format.Deserialize<T>(inSource);
  26.         }
  27.     }
複製代碼
2.(3) ConverterType.cs
  1.     public enum ConverterType
  2.     {
  3.         Xml,
  4.         Json
  5.     }
複製代碼
四、client呼叫
  1.     Converter converterXml = new Converter(ConverterType.Xml); // Xml
  2.     MyClassType myClass= converterXml.Deserialize<MyClassType>(xmlString); // Xml反序列化
  3.     string xmlSerializeString = converterXml .Serialize<MyClassType>(myClass); // Xml序列化

  4.     Converter converterJson = new Converter(ConverterType.Json); // Json
  5.     MyClassType myClass= converterJson.Deserialize<MyClassType>(jsonString); // Json反序列化
  6.     string jsonSerializeString = converterJson.Serialize<MyClassType>(myClass); // Json序列化
複製代碼
五、擴充
如果有新的格式要序列化與反序列化,
請修改以下幾個
1. ConverterType內建立新格式
2. Converter建構式內建立新的case
3. 新格式請繼承DataSourceFormatBase,並且實作

個人心得:
這是我用了一段時間的小工具,
我自己也擴充了不少格式,不過都是在反序列化的部分,
因為工作上的需求,常常要解析html、json、xml,所以我自己就根據不同網頁擴充,
這版本是我自己目前寫的最好用的一版,所以分享給網友,
如果有任何問題麻煩請在下方回復,謝謝。


作者: rr09192084    時間: 2015-1-6 09:50 PM

請問你是使用第三方的類別 Json.NET嗎?
作者: sam30525sam    時間: 2015-1-6 10:24 PM

rr09192084 發表於 2015-1-6 09:50 PM
請問你是使用第三方的類別 Json.NET嗎?

對,我忘了補上去。
因為json.net效率比較高,其他兩種方法實測後比較慢。




歡迎光臨 伊莉討論區 (http://www44.eyny.com/) Powered by Discuz!