You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

266 lines
9.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
//using System.Runtime.Serialization.Json;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Formatters.Binary;
namespace ViewWindow.Config
{
public class SerializeHelper
{
public SerializeHelper()
{ }
#region XML序列化
/// <summary>
/// 文件化XML序列化
/// </summary>
/// <param name="obj">对象</param>
/// <param name="filename">文件路径</param>
public static void Save(object obj, string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null) fs.Close();
}
}
/// <summary>
/// 文件化XML反序列化
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="filename">文件路径</param>
public static object Load(Type type, string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null) fs.Close();
}
}
/// <summary>
/// 文本化XML序列化
/// </summary>
/// <param name="item">对象</param>
public string ToXml<T>(T item)
{
XmlSerializer serializer = new XmlSerializer(item.GetType());
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb))
{
serializer.Serialize(writer, item);
return sb.ToString();
}
}
/// <summary>
/// 文本化XML反序列化
/// </summary>
/// <param name="str">字符串序列</param>
public T FromXml<T>(string str)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlReader reader = new XmlTextReader(new StringReader(str)))
{
return (T)serializer.Deserialize(reader);
}
}
#endregion
#region Json序列化
/// <summary>
/// JsonSerializer序列化
/// </summary>
/// <param name="item">对象</param>
//public string ToJson<T>(T item)
//{
// DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
// using (MemoryStream ms = new MemoryStream())
// {
// serializer.WriteObject(ms, item);
// return Encoding.UTF8.GetString(ms.ToArray());
// }
//}
///// <summary>
///// JsonSerializer反序列化
///// </summary>
///// <param name="str">字符串序列</param>
//public T FromJson<T>(string str) where T : class
//{
// DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
// using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))
// {
// return serializer.ReadObject(ms) as T;
// }
//}
#endregion
#region SoapFormatter序列化
/// <summary>
/// SoapFormatter序列化
/// </summary>
/// <param name="item">对象</param>
public string ToSoap<T>(T item)
{
SoapFormatter formatter = new SoapFormatter();
using (MemoryStream ms = new MemoryStream())
{
formatter.Serialize(ms, item);
ms.Position = 0;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
return xmlDoc.InnerXml;
}
}
/// <summary>
/// SoapFormatter反序列化
/// </summary>
/// <param name="str">字符串序列</param>
public T FromSoap<T>(string str)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(str);
SoapFormatter formatter = new SoapFormatter();
using (MemoryStream ms = new MemoryStream())
{
xmlDoc.Save(ms);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
#endregion
#region BinaryFormatter序列化
/// <summary>
/// BinaryFormatter序列化
/// </summary>
/// <param name="item">对象</param>
public string ToBinary<T>(T item)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
formatter.Serialize(ms, item);
ms.Position = 0;
byte[] bytes = ms.ToArray();
StringBuilder sb = new StringBuilder();
foreach (byte bt in bytes)
{
sb.Append(string.Format("{0:X2}", bt));
}
return sb.ToString();
}
}
/// <summary>
/// BinaryFormatter反序列化
/// </summary>
/// <param name="str">字符串序列</param>
public T FromBinary<T>(string str)
{
int intLen = str.Length / 2;
byte[] bytes = new byte[intLen];
for (int i = 0; i < intLen; i++)
{
int ibyte = Convert.ToInt32(str.Substring(i * 2, 2), 16);
bytes[i] = (byte)ibyte;
}
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream(bytes))
{
return (T)formatter.Deserialize(ms);
}
}
#endregion
/// <summary>
/// 获取对象序列化的二进制版本
/// </summary>
/// <param name="pObj">对象实体</param>
/// <returns>如果对象实体为Null则返回结果为Null。</returns>
public static byte[] GetBytes(object pObj)
{
if (pObj == null) { return null; }
MemoryStream serializationStream = new MemoryStream();
new BinaryFormatter().Serialize(serializationStream, pObj);
serializationStream.Position = 0L;
byte[] buffer = new byte[serializationStream.Length];
serializationStream.Read(buffer, 0, buffer.Length);
serializationStream.Close();
return buffer;
}
/// <summary>
/// 获取对象序列化的XmlDocument版本
/// </summary>
/// <param name="pObj">对象实体</param>
/// <returns>如果对象实体为Null则返回结果为Null。</returns>
public static XmlDocument GetXmlDoc(object pObj)
{
if (pObj == null) { return null; }
XmlSerializer serializer = new XmlSerializer(pObj.GetType());
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
serializer.Serialize((TextWriter)writer, pObj);
XmlDocument document = new XmlDocument();
document.LoadXml(sb.ToString());
writer.Close();
return document;
}
/// <summary>
/// 从已序列化数据中(byte[])获取对象实体
/// </summary>
/// <typeparam name="T">要返回的数据类型</typeparam>
/// <param name="binData">二进制数据</param>
/// <returns>对象实体</returns>
public static T GetObject<T>(byte[] binData)
{
if (binData == null) { return default(T); }
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream serializationStream = new MemoryStream(binData);
return (T)formatter.Deserialize(serializationStream);
}
/// <summary>
/// 从已序列化数据(XmlDocument)中获取对象实体
/// </summary>
/// <typeparam name="T">要返回的数据类型</typeparam>
/// <param name="xmlDoc">已序列化的文档对象</param>
/// <returns>对象实体</returns>
public static T GetObject<T>(XmlDocument xmlDoc)
{
if (xmlDoc == null) { return default(T); }
XmlNodeReader xmlReader = new XmlNodeReader(xmlDoc.DocumentElement);
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(xmlReader);
}
}
}