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)); } } }