WPF-序列化

莱莱  金牌会员 | 2023-1-12 11:20:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

  1. public class SerializeHelper
  2. {
  3.     #region 二进制格式
  4.   /// <summary>
  5.   ///  Binary 序列化使用前需要标记类可序列化
  6.   /// </summary>
  7.   /// <param name="fileName">序列化到指定的文件</param>
  8.   /// <param name="obj">需要序列化的类</param>
  9.   public static void BinarySerializer<T>(T obj, string fileName) where T : class
  10.   {
  11.       using (Stream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  12.       {
  13.           try
  14.           {
  15.               if (!Directory.GetParent(fileName).Exists)
  16.               {
  17.                   Directory.GetParent(fileName).Create();
  18.               }
  19.               BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
  20.               binFormat.Serialize(fStream, obj);
  21.               fStream.Close();
  22.           }
  23.           catch (Exception ex)
  24.           {
  25.               //HelperEvent.OnMessageColor?.Invoke("二进制文件序列化错误: " + ex.ToString(), Color.Red, "Main");
  26.           }
  27.       }
  28.   }
  29.   /// <summary>
  30.   /// Binary 反序列化使用前需要标记类可序列化
  31.   /// </summary>
  32.   /// <param name="filePath">从指定的文件序列化成相应对象</param>
  33.   /// <returns>反序列化后的类对象通过泛型限定</returns>
  34.   public static T BinaryDeserializer<T>(string fileName)
  35.   {
  36.       T obj = default(T);
  37.       if (System.IO.File.Exists(fileName))//检查文件是否存在
  38.       {
  39.           using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  40.           {
  41.               try
  42.               {
  43.                   fs.Position = 0;
  44.                   BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
  45.                   obj = (T)binFormat.Deserialize(fs);
  46.                   fs.Close();
  47.                   return obj;
  48.               }
  49.               catch (System.Exception ex)
  50.               {
  51.                   //HelperEvent.OnMessageColor?.Invoke("二进制文件反序列化错误:" + ex.ToString(), Color.Red,"Main");
  52.                   MessageBox.Show("二进制文件反序列化错误:" + fileName + ex.ToString(),"Main");
  53.               }
  54.           }
  55.       }
  56.       return obj;
  57.   }
  58. #endregion
  59.         #region Json 格式
  60.               /// <summary>
  61.               /// 反序列化json文件
  62.               /// </summary>
  63.               /// <param name="fileName"></param>
  64.               /// <returns>反序列化后的类对象通过泛型限定</returns>
  65.               public static T DeserializeJson<T>(string fileName)
  66.               {
  67.                   T obj = default(T);
  68.                   try
  69.                   {
  70.                       if (!File.Exists(fileName)) return obj;
  71.                       return JsonConvert.DeserializeObject<T>(File.ReadAllText(fileName));
  72.                   }
  73.                   catch (Exception ex)
  74.                   {
  75.                       //HelperEvent.OnMessageColor?.Invoke("Json文件序列化错误: " + ex.ToString(), Color.Red, "Main");
  76.                   }
  77.                   return obj;
  78.               }
  79.               /// <summary>
  80.               /// 序列化json文件
  81.               /// </summary>
  82.               /// <typeparam name="T">序列化限定的泛型</typeparam>
  83.               /// <param name="fileName">文件路径</param>
  84.               public static void SerializeJson<T>(T obj, string fileName) where T : class
  85.               {
  86.                   try
  87.                   {
  88.                       string dir = fileName.Substring(0, fileName.LastIndexOf('\\'));
  89.                       if (!Directory.Exists(dir))
  90.                       {
  91.                           Directory.CreateDirectory(dir);
  92.                       }
  93.                       var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
  94.                       var json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, jsonSetting);
  95.                       File.WriteAllText(fileName, json);
  96.                   }
  97.                   catch (Exception ex)
  98.                   {
  99.                       //HelperEvent.OnMessageColor?.Invoke("Json文件反序列化错误: " + ex.ToString(), Color.Red, "Main");
  100.                   }
  101.               }
  102.               #endregion
  103.               #region XML格式
  104.                     /// <summary>
  105.                     ///
  106.                     ///《/summary>
  107.                     /// <typeparam name="T">限定的泛型类型</typeparam>
  108.                     /// <param name="fileName">文件路径</param>
  109.                     /// <param name="obj">序列化的对象</param>
  110.                     /// <param name="omitXmlDeclaration">是否需要xml版本描述</param>
  111.                     /// <param name="removeDefaultNameSpace">是否从新开始添加</param>
  112.                     public static void XmlSerialize<T>(string fileName, T obj, bool omitXmlDeclaration, bool removeDefaultNameSpace)
  113.                     {
  114.                         try
  115.                         {
  116.                             XmlWriterSettings xmlSetting = new XmlWriterSettings();
  117.                             xmlSetting.OmitXmlDeclaration = omitXmlDeclaration;
  118.                             xmlSetting.Indent = true;
  119.                             xmlSetting.Encoding = new UTF8Encoding(false);
  120.                             xmlSetting.NewLineChars = Environment.NewLine;
  121.                             using (XmlWriter xmlWriter = XmlWriter.Create(fileName, xmlSetting))
  122.                             {
  123.                                 XmlSerializerNamespaces xmlms = new XmlSerializerNamespaces();
  124.                                 if (removeDefaultNameSpace)
  125.                                 {
  126.                                     xmlms.Add(string.Empty, string.Empty);
  127.                                 }
  128.                                 XmlSerializer ser = new XmlSerializer(typeof(T));
  129.                                 ser.Serialize(xmlWriter, obj, xmlms);
  130.                             }
  131.                         }
  132.                         catch (Exception ex)
  133.                         {
  134.                             //HelperEvent.OnMessageColor?.Invoke("XML文件序列化错误: " + ex.ToString(), Color.Red, "Main");
  135.                         }
  136.                     }
  137.                     /// <summary>
  138.                     /// xml反序列化
  139.                     /// </summary>
  140.                     /// <typeparam name="T">限定的泛型类型</typeparam>
  141.                     /// <param name="fileName">文件路径</param>
  142.                     /// <returns>返回限定的泛型类</returns>
  143.                     public static T XmlDeserialize<T>(string fileName) where T : class
  144.                     {
  145.                         try
  146.                         {
  147.                             XmlReaderSettings xmlReaderSetting = new XmlReaderSettings();
  148.                             xmlReaderSetting.CloseInput = true;
  149.                             using (XmlReader xmlReader = XmlReader.Create(fileName, xmlReaderSetting))
  150.                             {
  151.                                 XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
  152.                                 return (T)xmlSerializer.Deserialize(xmlReader);
  153.                             }
  154.                         }
  155.                         catch (Exception ex)
  156.                         {
  157.                             //HelperEvent.OnMessageColor?.Invoke("XML文件反序列化错误: " + ex.ToString(), Color.Red, "Main");
  158.                             return null;
  159.                         }
  160.                     }
  161.                 #endregion
  162.     }
复制代码
对象序列化需要在类上面加上[Serializable]

调用:path是程序的exe目录,data是序列化文件的


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表