using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Text;
namespace BatchService.Framework.Utility
{
public enum SerializationType
{
Xml,
Json,
DataContract,
Binary
}
[System.Serializable]
public class SerializationHelper
{
private SerializationHelper()
{
}
#region ========== XmlSerializer ==========
///
/// 序列化,使用标准的XmlSerializer,优先考虑使用。
/// 不能序列化IDictionary接口.
///
/// 对象
/// 文件路径
public static void XmlSerialize(object obj, string filename)
{
FileStream fs = null;
// serialize it...
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
finally
{
if (fs != null)
fs.Close();
}
}
///
/// 反序列化,使用标准的XmlSerializer,优先考虑使用。
/// 不能序列化IDictionary接口.
///
/// 对象类型
/// 文件路径
/// type类型的对象实例
public static object XmlDeserializeFromFile(Type type, string filename)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
finally
{
if (fs != null)
fs.Close();
}
}
public static string XmlSerialize(object obj, System.Text.Encoding ecoding)
{
if (obj == null)
{
return null;
}
XmlSerializer ser = new XmlSerializer(obj.GetType());
MemoryStream stream = new MemoryStream();//制定编码和磁盘文件
StreamWriter sWriter = new StreamWriter(stream, ecoding);
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
//empty namespaces
xsn.Add(String.Empty, String.Empty);
ser.Serialize(sWriter, obj, xsn);//序列化
string str = ecoding.GetString(stream.ToArray());
stream.Close();
return str;
}
public static string XmlSerialize(object obj)
{
if (obj == null)
{
return null;
}
XmlSerializer ser = new XmlSerializer(obj.GetType());
StringWriter sWriter = new StringWriter();
ser.Serialize(sWriter, obj);
return sWriter.ToString();
}
public static object XmlDeserialize(Type type, string xmlStr)
{
if (xmlStr == null || xmlStr.Trim() == "")
{
return null;
}
XmlSerializer ser = new XmlSerializer(type);
StringReader sWriter = new StringReader(xmlStr);
return ser.Deserialize(sWriter);
}
#endregion
#region ========== DataContractSerializer ==========
public static string DataContractSerialize(object o)
{
if (o == null)
{
return null;
}
MemoryStream stream = new MemoryStream();
DataContractSerializer ser = new DataContractSerializer(o.GetType());
ser.WriteObject(stream, o);
string ret = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return ret;
}
public static object DataContractDeserialize(Type type, string xmlStr)
{
if (xmlStr == null || xmlStr.Trim() == "")
{
return null;
}
DataContractSerializer ser = new DataContractSerializer(type);
MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xmlStr));//new StringReader(xmlStr);
return ser.ReadObject(stream);
}
#endregion
#region ========== BinaryBytes ==========
///
/// 将对象使用二进制格式序列化成byte数组
///
/// 待保存的对象
/// byte数组
public static byte[] SaveToBinaryBytes(object obj)
{
//将对象序列化到MemoryStream中
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
//从MemoryStream中获取获取byte数组
return ms.ToArray();
}
public static void SaveToFile(object obj, string i_path)
{
using (FileStream t_fs = new FileStream(i_path, FileMode.Create))
{
byte[] t_bytes = SaveToBinaryBytes(obj);
t_fs.Write(t_bytes, 0, t_bytes.Length);
t_fs.Close();
}
}
public static T LoadFile(string i_path)
{
T local = default(T);
using (FileStream t_fs = new FileStream(i_path, FileMode.Open))
{
byte[] t_bytes = new byte[t_fs.Length];
t_fs.Read(t_bytes, 0, t_bytes.Length);
t_fs.Close();
local = (T)LoadFromBinaryBytes(t_bytes);
}
return local;
}
///
/// 将使用二进制格式保存的byte数组反序列化成对象
///
/// byte数组
/// 对象
public static object LoadFromBinaryBytes(byte[] bytes)
{
object result = null;
BinaryFormatter formatter = new BinaryFormatter();
if (bytes != null)
{
MemoryStream ms = new MemoryStream(bytes);
result = formatter.Deserialize(ms);
}
return result;
}
#endregion
#region ========= other ==========
///
/// 使用BinaryFormatter将对象系列化到MemoryStream中。
///
/// 对象
/// 保存对象的MemoryStream
public static MemoryStream SaveToMemoryStream(object obj)
{
MemoryStream ms = new MemoryStream();
BufferedStream stream = new BufferedStream(ms);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
return ms;
}
#endregion
///
/// 将C#数据实体转化为JSON数据
///
/// 要转化的数据实体
/// JSON格式字符串
public static string JsonSerialize(T obj)
{
return JsonSerialize(obj, Encoding.UTF8);
}
///
/// 将C#数据实体转化为JSON数据
///
/// 要转化的数据实体
/// JSON格式字符串
public static string JsonSerialize(object obj, Encoding encoding)
{
if (obj == null)
{
return null;
}
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, obj);
stream.Position = 0;
StreamReader sr = new StreamReader(stream, encoding);
string resultStr = sr.ReadToEnd();
sr.Close();
stream.Close();
return resultStr;
}
///
/// 将JSON数据转化为C#数据实体
///
/// 符合JSON格式的字符串
/// T类型的对象
public static T JsonDeserialize(string json)
{
return (T)JsonDeserialize(typeof(T), json);
}
///
/// 将JSON数据转化为C#数据实体
///
/// 符合JSON格式的字符串
/// T类型的对象
public static object JsonDeserialize(Type type, string json)
{
if (json == null)
{
return null;
}
//json 必须为 {name:"value",name:"value"} 的格式(要符合JSON格式要求)
DataContractJsonSerializer serializer = new DataContractJsonSerializer(type);
MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json.ToCharArray()));
object obj = serializer.ReadObject(ms);
ms.Close();
return obj;
}
}
}