C#中的序列化

    xiaoxiao2021-12-14  43

    什么是序列化?

    System.Runtime.Serizlization 命名空间中实现了序列化的技术,序列化是将对象转换成线性字节,以便进行存储和传输,而反序列化是将序列化之后的有序字段转换成对象。

    如何序列化一个对象?

    1.创建一个流对象来保存序列化后的输出。 2.创建BinaryFormatter对象(位于:System.Runtimes.Serialization.Formatters.Binary命名空间) 3.调用BinaryFormatter.Serialize方法序列化并输出结果到流对象。 string data = "This must be stored in a file"; FileStream fs = new FileStream("SerializedString.Data", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs,data); fs.Close();

    打开生成的文件SerializedString.data能够看到二进制的存储字符串内容

    如何反序列化一个对象?

    1.创建流对象以读取序列化输出。 2.创建BinaryFormatter对象。 3.创建新对象以存储反序列化后的对象。 4.调用BinaryFormatter.Deserialize方法以反序列化对象,转型成正确的类型。 FileStream fsm = new FileStream("SerializedString.Data",FileMode.Open); BinaryFormatter bfr = new BinaryFormatter(); string a = (string)bfr.Deserialize(fsm); Console.WriteLine(a); fsm.Close();

    如何创建可序列化的类?

    1.只需要在类上面添加 [Serializable] 特性。标识可以序列化。 [Serializable] class ShoppingCartItem { public int ProductId { get; set; } public Decimal Price { get; set; } //序列化时候忽略成员 [NonSerialized] public string Name { get; set; } public ShoppingCartItem(int _productId,Decimal _price,string _name) { ProductId = _productId; Price = _price; Name = _name; } }

    引用命名空间

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; using System.Runtime.Serialization.Formatters.Soap;

    将一个Object 序列化Json格式字符串

    /// <summary> /// original Json Serizlization Method /// </summary> /// <param name="obj">Object</param> /// <returns>Json String</returns> public string ObjectToJson(object obj) { string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj); return jsonString; }

    XML文件序列化

    #region 文件化XML序列化 /// <summary> /// 文件化XML序列化 /// </summary> /// <param name="obj">对象</param> /// <param name="filename">文件路径</param> public static void Save(object obj, string filename) { using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(fs, obj); } } #endregion

    XML文件反序列化

    #region 文件化XML反序列化 /// <summary> /// 文件化XML反序列化 /// </summary> /// <param name="type">对象类型</param> /// <param name="filename">文件路径</param> public static object Load(Type type, string filename) { using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(fs); } } #endregion

    三、SoapFormatter序列化/反序列化

    #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; } } #endregion #region SoapFormatter反序列化 /// <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

    四、BinaryFormatter序列化/反序列化

    #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(); } } #endregion #region BinaryFormatter反序列化 /// <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
    转载请注明原文地址: https://ju.6miu.com/read-970161.html

    最新回复(0)