標籤:xml json 二進位 序列化 binaryformatter
昨天利用業餘時間對比了下C#中三種序列化方式(二進位、Xml、Json),綜合來看json方式產生的位元組數組長度最短,但當你需要序列化的對象中包括byte[]類型,且其長度較長時,序列化後,xml方式的長度較json方式更短。xml方式中對byte[]做了base64轉換。
最後綜合三種情況,寫了一個基於泛型的通用類來完成序列化和還原序列化操作,僅供參考,若有什麼錯誤之處,還請指教。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.Serialization.Json;using System.Xml.Serialization;using System.Runtime.Serialization.Formatters.Binary;namespace Leaf.Lib.Data{ /// <summary> /// 對象序列化/還原序列化 /// </summary> public class Serialization { /// <summary> /// 序列化類別型 /// </summary> public enum SerializeType { Binary, Json, Xml } /// <summary> /// 對象還原序列化 /// </summary> /// <typeparam name="T">物件類型</typeparam> /// <param name="aSerializeData">序列化位元組數組</param> /// <param name="aType">序列化方式</param> /// <returns></returns> public static T Deserialize<T>(byte[] aSerializeData, SerializeType aType) { T obj = default(T); ; if (aSerializeData != null && aSerializeData.Length > 0) { MemoryStream stream = new MemoryStream(aSerializeData); switch (aType) { case SerializeType.Binary: BinaryFormatter bf = new BinaryFormatter(); obj = (T)bf.Deserialize(stream); break; case SerializeType.Json: DataContractJsonSerializer djs = new DataContractJsonSerializer(typeof(T)); obj = (T)djs.ReadObject(stream); break; case SerializeType.Xml: XmlSerializer xs = new XmlSerializer(typeof(T)); obj = (T)xs.Deserialize(stream); break; } stream.Close(); } return obj; } /// <summary> /// 對象序列化 /// </summary> /// <typeparam name="T">物件類型</typeparam> /// <param name="aData">需要序列化的對象</param> /// <param name="aType">序列化方式</param> /// <returns></returns> public static byte[] Serialize<T>(T aData, SerializeType aType) { MemoryStream stream = new MemoryStream(); switch (aType) { case SerializeType.Binary: BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(stream, aData); break; case SerializeType.Json: DataContractJsonSerializer djs = new DataContractJsonSerializer(typeof(T)); djs.WriteObject(stream, aData); break; case SerializeType.Xml: XmlSerializer xs = new XmlSerializer(typeof(T)); xs.Serialize(stream, aData); break; } byte[] data = stream.ToArray(); stream.Close(); return data; } }}