/// <summary> /// 序列化接口 /// </summary> public interface ILibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> Stream SerializeToStream(object instance, Type type); /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> void SerializeToFile(string fileName, object instance, Type type); /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>对象字符串流</returns> string SerializeToString(object instance, Type type); /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> object DeserializeFromString(string objectString, Type type); /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> object DeserializeFromStream(Stream stream, Type type); /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> object DeserializeFromFile(string fileName, Type type); } /// <summary> /// 序列化基类 /// </summary> public class LibSerializer : ILibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public virtual Stream SerializeToStream(object instance, Type type) { return null; } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public virtual void SerializeToFile(string fileName, object instance, Type type) { } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>字符串</returns> public virtual string SerializeToString(object instance, Type type) { return String.Empty; } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public virtual object DeserializeFromString(string objectString, Type type) { return null; } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public virtual object DeserializeFromStream(Stream stream, Type type) { return null; } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public virtual object DeserializeFromFile(string fileName, Type type) { return null; } } /// <summary> /// 二进制序列化类 /// </summary> public class LibBinarySerializer : LibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public override Stream SerializeToStream(object instance, Type type) { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new CustomSerializationBinder(); MemoryStream stream = new MemoryStream(); bf.Serialize(stream, instance); return stream; } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public override void SerializeToFile(string fileName, object instance, Type type) { string sDirPath = LibSysUtils.GetDirectory(fileName); if (!LibSysUtils.PathExists(sDirPath)) { LibSysUtils.CreatePath(sDirPath); } using (FileStream fs = new FileStream(fileName, FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new CustomSerializationBinder(); bf.Serialize(fs, instance); fs.Close(); } } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>字符串</returns> public override string SerializeToString(object instance, Type type) { using (MemoryStream stream = (MemoryStream)SerializeToStream(instance, type)) { byte[] dataBuf = stream.ToArray(); string result = Convert.ToBase64String(dataBuf); return result; } } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromString(string objectString, Type type) { byte[] dataBuf = Convert.FromBase64String(objectString); using (MemoryStream stream = new MemoryStream(dataBuf)) { stream.Position = 0; stream.Seek(0, SeekOrigin.Begin); object result = DeserializeFromStream(stream, type); return result; } } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromStream(Stream stream, Type type) { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new CustomSerializationBinder(); return bf.Deserialize(stream); } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromFile(string fileName, Type type) { object objResult = null; using (FileStream fs = new FileStream(fileName, FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new CustomSerializationBinder(); objResult = bf.Deserialize(fs); fs.Close(); } return objResult; } } /// <summary> /// SOAP格式序列化类 /// </summary> public class LibSoapSerializer : LibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public override Stream SerializeToStream(object instance, Type type) { MemoryStream stream = new MemoryStream(); SoapFormatter sf = new SoapFormatter(); sf.Binder = new CustomSerializationBinder(); sf.Serialize(stream, instance); return stream; } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public override void SerializeToFile(string fileName, object instance, Type type) { string sDirPath = LibSysUtils.GetDirectory(fileName); if (!LibSysUtils.PathExists(sDirPath)) { LibSysUtils.CreatePath(sDirPath); } using (FileStream fs = new FileStream(fileName, FileMode.Create)) { SoapFormatter sf = new SoapFormatter(); sf.Binder = new CustomSerializationBinder(); sf.Serialize(fs, instance); fs.Close(); } } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>字符串</returns> public override string SerializeToString(object instance, Type type) { using (MemoryStream ms = SerializeToStream(instance, type) as MemoryStream) { ms.Position = 0; ms.Seek(0, SeekOrigin.Begin); byte[] dataBuf = ms.ToArray(); string result = UTF8Encoding.UTF8.GetString(dataBuf); ms.Close(); return result; } } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromString(string objectString, Type type) { using (MemoryStream ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(objectString))) { ms.Position = 0; ms.Seek(0, SeekOrigin.Begin); object result = DeserializeFromStream(ms, type); ms.Close(); return result; } } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromStream(Stream stream, Type type) { SoapFormatter sf = new SoapFormatter(); sf.Binder = new CustomSerializationBinder(); return sf.Deserialize(stream); } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromFile(string fileName, Type type) { object objResult = null; using (FileStream fs = new FileStream(fileName, FileMode.Open)) { SoapFormatter sf = new SoapFormatter(); sf.Binder = new CustomSerializationBinder(); objResult = sf.Deserialize(fs); fs.Close(); } return objResult; } } /// <summary> /// XML格式序列化类 /// </summary> public class LibXmlSerializer : LibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public override Stream SerializeToStream(object instance, Type type) { XmlSerializer serializer = new XmlSerializer(type); MemoryStream stream = new MemoryStream(); serializer.Serialize(stream, instance); return stream; } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public override void SerializeToFile(string fileName, object instance, Type type) { string sDirPath = LibSysUtils.GetDirectory(fileName); if (!LibSysUtils.PathExists(sDirPath)) { LibSysUtils.CreatePath(sDirPath); } using (FileStream fs = new FileStream(fileName, FileMode.Create)) { XmlSerializer serializer = new XmlSerializer(type); serializer.Serialize(fs, instance); fs.Close(); } } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>字符串</returns> public override string SerializeToString(object instance, Type type) { using (StringWriter sw = new StringWriter()) { XmlSerializer xz = new XmlSerializer(type); xz.Serialize(sw, type); return sw.ToString(); } } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromString(string objectString, Type type) { using (StringReader sr = new StringReader(objectString)) { XmlSerializer xz = new XmlSerializer(type); return xz.Deserialize(sr); } } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromStream(Stream stream, Type type) { XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(stream); } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromFile(string fileName, Type type) { object objResult = null; using (FileStream fs = new FileStream(fileName, FileMode.Open)) { XmlSerializer serializer = new XmlSerializer(type); objResult = serializer.Deserialize(fs); fs.Close(); } return objResult; } } /// <summary> /// Json格式序列化类 /// </summary> public class LibJsonSerializer : LibSerializer { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public override Stream SerializeToStream(object instance, Type type) { MemoryStream stream = new MemoryStream(); string result = this.SerializeToString(instance, type); byte[] resultBytes = Encoding.UTF8.GetBytes(result); stream.Write(resultBytes, 0, resultBytes.Length); stream.Position = 0; return stream; } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public override void SerializeToFile(string fileName, object instance, Type type) { string sDirPath = LibSysUtils.GetDirectory(fileName); if (!LibSysUtils.PathExists(sDirPath)) { LibSysUtils.CreatePath(sDirPath); } using (FileStream fs = new FileStream(fileName, FileMode.Create)) { string result = this.SerializeToString(instance, type); byte[] resultBytes = Encoding.UTF8.GetBytes(result); fs.Write(resultBytes, 0, resultBytes.Length); fs.Close(); } } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>字符串</returns> public override string SerializeToString(object instance, Type type) { return JsonConvert.SerializeObject(instance); } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="objectString">对象字符串</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromString(string objectString, Type type) { object result = JsonConvert.DeserializeObject(objectString, type); return result; } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromStream(Stream stream, Type type) { byte[] dataBuf = new byte[stream.Length]; stream.Read(dataBuf, 0, dataBuf.Length); string dataStr = Encoding.UTF8.GetString(dataBuf); object result = this.DeserializeFromString(dataStr, type); return result; } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public override object DeserializeFromFile(string fileName, Type type) { object objResult = null; using (FileStream fs = new FileStream(fileName, FileMode.Open)) { byte[] dataBuf = new byte[fs.Length]; fs.Read(dataBuf, 0, dataBuf.Length); string dataStr = Encoding.UTF8.GetString(dataBuf); objResult = this.DeserializeFromString(dataStr, type); fs.Close(); } return objResult; } } /// <summary> /// 序列化控制类 /// </summary> public class LibSerializerControl { /// <summary> /// 序列化对象到流 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>流</returns> public static Stream SerializeToStream<T>(object instance, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.SerializeToStream(instance, type); } /// <summary> /// 序列化对象到文件 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> public static void SerializeToFile<T>(string fileName, object instance, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; serializer.SerializeToFile(fileName, instance, type); } /// <summary> /// 序列化对象到字符串 /// </summary> /// <param name="instance">对象</param> /// <param name="type">对象类型</param> /// <returns>返回对象字符串流</returns> public static string SerializeToString<T>(object instance, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.SerializeToString(instance, type); } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="stream">对象字符串流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public static object DeserializeFromString<T>(string objectString, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.DeserializeFromString(objectString, type); } /// <summary> /// 从字符串中反序列化出对象 /// </summary> /// <param name="stream">对象字符串流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public static object TryDeserializeFromString<T>(string objectString, Type type) where T : ILibSerializer { try { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.DeserializeFromString(objectString, type); } catch { return null; } } /// <summary> /// 从流中反序列化出对象 /// </summary> /// <param name="stream">对象流</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public static object DeserializeFromStream<T>(Stream stream, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.DeserializeFromStream(stream, type); } /// <summary> /// 从文件反序列化出对象 /// </summary> /// <param name="fileName">文件路径</param> /// <param name="type">对象类型</param> /// <returns>对象</returns> public static object DeserializeFromFile<T>(string fileName, Type type) where T : ILibSerializer { ILibSerializer serializer = Activator.CreateInstance(typeof(T)) as ILibSerializer; return serializer.DeserializeFromFile(fileName, type); } /// <summary> /// 克隆对象 /// </summary> /// <param name="instance">对象</param> /// <returns>返回流对象</returns> public static object CloneObject(object instance) { object result = null; using (Stream stream = SerializeToStream<LibBinarySerializer>(instance, instance.GetType())) { stream.Position = 0; result = DeserializeFromStream<LibBinarySerializer>(stream, instance.GetType()); stream.Close(); return result; } } }
【代码片段】序列化和反序列化之接口和控制类
猜你喜欢
转载自blog.csdn.net/michelsn/article/details/80297751
今日推荐
周排行