using Newtonsoft.Json;
using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Venus_Unity
{
public class SerializeHelper
{
private static SerializeHelper m_Instance;
public static SerializeHelper Instance
{
get
{
if (m_Instance == null)
{
m_Instance = new SerializeHelper();
}
return m_Instance;
}
}
public SerializeHelper()
{ }
#region XML序列化
///
/// 文件化XML序列化
///
/// 对象
/// 文件路径
public void Save(object obj, string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj, ns);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null) fs.Close();
}
}
///
/// 文件化XML反序列化
///
/// 对象类型
/// 文件路径
public 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();
}
}
///
/// 文本化XML序列化
///
/// 对象
public string ToXml(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();
}
}
///
/// 文本化XML反序列化
///
/// 字符串序列
public T FromXml(string str)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlReader reader = new XmlTextReader(new StringReader(str)))
{
return (T)serializer.Deserialize(reader);
}
}
#endregion
#region BinaryFormatter序列化
///
/// BinaryFormatter序列化
///
/// 对象
public string ToBinary(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();
}
}
///
/// BinaryFormatter反序列化
///
/// 字符串序列
public T FromBinary(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
///
/// 将对象序列化为二进制字节
///
/// 待序列化的对象
///
public byte[] SerializeToBinary(object obj)
{
byte[] bytes = new byte[2500];
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter bformatter = new BinaryFormatter();
bformatter.Serialize(memoryStream, obj);
memoryStream.Seek(0, 0);
if (memoryStream.Length > bytes.Length)
{
bytes = new byte[memoryStream.Length];
}
bytes = memoryStream.ToArray();
}
return bytes;
}
///
/// 从二进制字节中反序列化为对象
///
/// 对象的类型
/// 字节数组
/// 反序列化后得到的对象
public object DeserializeFromBinary(Type type, byte[] bytes)
{
object result = new object();
using (MemoryStream memoryStream = new MemoryStream(bytes))
{
BinaryFormatter serializer = new BinaryFormatter();
result = serializer.Deserialize(memoryStream);
}
return result;
}
///
/// 将文件对象序列化到文件中
///
/// 待序列化的对象
/// 文件路径
/// 文件打开模式
public void SerializeToBinary(object obj, string path, FileMode fileMode)
{
using (FileStream fs = new FileStream(path, fileMode))
{
// Construct a BinaryFormatter and use it to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
}
}
///
/// 将文件对象序列化到文件中
///
/// 待序列化的对象
/// 文件路径
public void SerializeToBinary(object obj, string path)
{
SerializeToBinary(obj, path, FileMode.Create);
}
///
/// 从二进制文件中反序列化为对象
///
/// 对象的类型
/// 二进制文件路径
/// 反序列化后得到的对象
public object DeserializeFromBinary(Type type, string path)
{
object result = new object();
using (FileStream fileStream = new FileStream(path, FileMode.Open))
{
BinaryFormatter serializer = new BinaryFormatter();
result = serializer.Deserialize(fileStream);
}
return result;
}
///
/// 获取对象的转换为二进制的字节大小
///
///
///
public long GetByteSize(object obj)
{
long result;
BinaryFormatter bFormatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
bFormatter.Serialize(stream, obj);
result = stream.Length;
}
return result;
}
///
/// 克隆一个对象
///
/// 待克隆的对象
/// 克隆的一个新的对象
public object Clone(object obj)
{
object cloned = null;
BinaryFormatter bFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
try
{
bFormatter.Serialize(memoryStream, obj);
memoryStream.Seek(0, SeekOrigin.Begin);
cloned = bFormatter.Deserialize(memoryStream);
}
catch //(Exception e)
{
;
}
}
return cloned;
}
///
/// 从文件中读取文本内容
///
/// 文件路径
/// 文件的内容
public string ReadFile(string path)
{
string content = string.Empty;
using (StreamReader reader = new StreamReader(path))
{
content = reader.ReadToEnd();
}
return content;
}
private byte[] compress(byte[] bytes)
{
using (MemoryStream ms = new MemoryStream())
{
using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Compress, false))
{
gzs.Write(bytes, 0, bytes.Length);
}
ms.Close();
return ms.GetBuffer();
}
}
private byte[] decompress(byte[] bytes)
{
using (MemoryStream ms = new MemoryStream(bytes, false))
{
using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Decompress, false))
{
using (MemoryStream dest = new MemoryStream())
{
byte[] tmp = new byte[bytes.Length];
int read;
while ((read = gzs.Read(tmp, 0, tmp.Length)) != 0)
{
dest.Write(tmp, 0, read);
}
dest.Close();
return dest.GetBuffer();
}
}
}
}
///
/// 序列化成一个字符串
///
///
///
///
public string XMLSerializeToString(T entity)
{
StringBuilder buffer = new StringBuilder();
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextWriter writer = new StringWriter(buffer))
{
serializer.Serialize(writer, entity);
}
return buffer.ToString();
}
///
/// xml字符串反序列化为一个XML文件
///
///
///
///
public T DeXMLSerialize(string xmlString)
{
T cloneObject = default(T);
StringBuilder buffer = new StringBuilder();
buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(buffer.ToString()))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
///
/// Json转换成对象
///
///
///
///
public T JsonStringToObject(string jsonText)
{
DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
T obj = (T)s.ReadObject(ms);
ms.Dispose();
return obj;
}
///
/// 对象转换成JSON
///
///
///
///
public string ObjectToJsonString(T obj)
{
string result = string.Empty;
try
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
ms.Position = 0;
using (StreamReader read = new StreamReader(ms))
{
result = read.ReadToEnd();
}
}
}
catch (Exception ex)
{
throw new Exception(" 对象转换成JSON失败!" + ex.Message);
}
return result;
}
///
/// 类对象保存为Json文件
///
///
///
///
///
public bool WriteToJsonFile(T obj, string strFilePath)
{
bool bRes = false;
try
{
string strJson = ObjectToJsonString(obj);
//File.WriteAllText(strFilePath, strJson, Encoding.UTF8);
WriteToJsonFile(strJson, strFilePath);
bRes = true;
}
catch (Exception ex)
{
throw new Exception("Write Json File Fail!" + ex.Message);
}
return bRes;
}
///
/// Json文件转换为类对象
///
///
///
///
public T ReadFromJsonFile(string strFilePath)
{
if (File.Exists(strFilePath))
{
try
{
string strJson = File.ReadAllText(strFilePath);
return JsonStringToObject(strJson);
}
catch (Exception ex)
{
throw new Exception("Read Json File Fail!" + ex.Message);
}
}
else
{
throw new Exception("File is not Exit!");
}
}
///
/// 对象转换成JSON,并保存文件
///
///
///
public void WriteToJsonFile(string content, string path)
{
if (!File.Exists(path)) // 判断是否已有相同文件
{
FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
fs1.Flush();
fs1.Dispose();
fs1.Close();
}
File.WriteAllText(path, ConvertJsonString(content));
}
///
/// 格式化json字符串
///
///
///
private string ConvertJsonString(string str)
{
JsonSerializer serializer = new JsonSerializer();
TextReader tr = new StringReader(str);
JsonTextReader jtr = new JsonTextReader(tr);
object obj = serializer.Deserialize(jtr);
if (obj != null)
{
StringWriter textWriter = new StringWriter();
JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
{
Formatting = Newtonsoft.Json.Formatting.Indented,
Indentation = 4,
IndentChar = ' '
};
serializer.Serialize(jsonWriter, obj);
return textWriter.ToString();
}
else
{
return str;
}
}
public static T DeepCopyJson(T obj)
{
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj));
}
}
}