伊莉討論區
標題:
序列化與反序列化,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
public interface IDataSourceFormatBase
{
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T">序列化型別</typeparam>
/// <param name="inObject">序列化型別的物件</param>
/// <returns>序列化字串</returns>
string Serialize<T>(T inObject) where T : class;
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T">反序列化型別</typeparam>
/// <param name="inSource">來源字串</param>
/// <returns>反序列化型別的物件</returns>
T Deserialize<T>(String inSource) where T : class;
}
複製代碼
1.(2) DataSourceFormatBase
public abstract class DataSourceFormatBase : IDataSourceFormatBase
{
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T">序列化型別</typeparam>
/// <param name="inObject">序列化型別的物件</param>
/// <returns>序列化字串</returns>
public abstract string Serialize<T>(T inObject) where T : class;
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T">反序列化型別</typeparam>
/// <param name="inSource">來源字串</param>
/// <returns>反序列化型別的物件</returns>
public abstract T Deserialize<T>(string inSource) where T : class;
}
複製代碼
1.(3) DataSourceJson.cs
public class DataSourceJson : DataSourceFormatBase
{
/// <summary>
/// Json序列化
/// </summary>
/// <typeparam name="T">序列化型別</typeparam>
/// <param name="inObject">序列化型別的物件</param>
/// <returns>序列化字串</returns>
public override string Serialize<T>(T inObject)
{
return JsonConvert.SerializeObject(inObject);
}
/// <summary>
/// Json反序列化
/// </summary>
/// <typeparam name="T">反序列化型別</typeparam>
/// <param name="inSource">來源字串</param>
/// <returns>反序列化型別的物件</returns>
public override T Deserialize<T>(string inSource)
{
return JsonConvert.DeserializeObject<T>(inSource);
}
}
複製代碼
1.(4) DataSourceXml.cs
public class DataSourceXml : DataSourceFormatBase
{
/// <summary>
/// Xml序列化
/// </summary>
/// <typeparam name="T">序列化型別</typeparam>
/// <param name="inObject">序列化型別的物件</param>
/// <returns>序列化字串</returns>
public override string Serialize<T>(T inObject)
{
using (StringWriter writer = new StringWriter())
{
XmlSerializer xml = new XmlSerializer(typeof(T));
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] { new XmlQualifiedName(string.Empty, string.Empty) });
xml.Serialize(writer, inObject, namespaces);
return writer.ToString();
}
}
/// <summary>
/// Xml反序列化
/// </summary>
/// <typeparam name="T">反序列化型別</typeparam>
/// <param name="inSource">來源字串</param>
/// <returns>反序列化型別的物件</returns>
public override T Deserialize<T>(string inSource)
{
using (StringReader reader = new StringReader(inSource))
{
XmlSerializer xml = new XmlSerializer(typeof(T));
return xml.Deserialize(reader) as T;
}
}
}
複製代碼
2.(1) IConverter.cs
interface IConverter
{
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T">序列化型別</typeparam>
/// <param name="inObject">序列化型別的物件</param>
/// <returns>序列化字串</returns>
string Serialize<T>(T inObject) where T : class;
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T">反序列化型別</typeparam>
/// <param name="inSource">來源字串</param>
/// <returns>反序列化型別的物件</returns>
T Deserialize<T>(String inSource) where T : class;
}
複製代碼
2.(2) Converter.cs
public class Converter : IConverter
{
private DataSourceFormatBase Format { get; set; }
public Converter(ConverterType inType)
{
switch (inType)
{
case ConverterType.Xml:
this.Format = new DataSourceXml();
break;
case ConverterType.Json:
this.Format = new DataSourceJson();
break;
default:
this.Format = null;
break;
}
}
public string Serialize<T>(T inObject) where T : class
{
return this.Format.Serialize<T>(inObject);
}
public T Deserialize<T>(string inSource) where T : class
{
return this.Format.Deserialize<T>(inSource);
}
}
複製代碼
2.(3) ConverterType.cs
public enum ConverterType
{
Xml,
Json
}
複製代碼
四、client呼叫
Converter converterXml = new Converter(ConverterType.Xml); // Xml
MyClassType myClass= converterXml.Deserialize<MyClassType>(xmlString); // Xml反序列化
string xmlSerializeString = converterXml .Serialize<MyClassType>(myClass); // Xml序列化
Converter converterJson = new Converter(ConverterType.Json); // Json
MyClassType myClass= converterJson.Deserialize<MyClassType>(jsonString); // Json反序列化
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!