莱莱 发表于 2023-1-12 11:20:57

WPF-序列化

public class SerializeHelper
{

    #region 二进制格式
/// <summary>
///Binary 序列化使用前需要标记类可序列化
/// </summary>
/// <param name="fileName">序列化到指定的文件</param>
/// <param name="obj">需要序列化的类</param>
public static void BinarySerializer<T>(T obj, string fileName) where T : class
{
      using (Stream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
      {
          try
          {
            if (!Directory.GetParent(fileName).Exists)
            {
                  Directory.GetParent(fileName).Create();
            }
            BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
            binFormat.Serialize(fStream, obj);
            fStream.Close();
          }
          catch (Exception ex)
          {
            //HelperEvent.OnMessageColor?.Invoke("二进制文件序列化错误: " + ex.ToString(), Color.Red, "Main");
          }
      }
}

/// <summary>
/// Binary 反序列化使用前需要标记类可序列化
/// </summary>
/// <param name="filePath">从指定的文件序列化成相应对象</param>
/// <returns>反序列化后的类对象通过泛型限定</returns>
public static T BinaryDeserializer<T>(string fileName)
{
      T obj = default(T);
      if (System.IO.File.Exists(fileName))//检查文件是否存在
      {
          using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
          {
            try
            {
                  fs.Position = 0;
                  BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
                  obj = (T)binFormat.Deserialize(fs);
                  fs.Close();
                  return obj;
            }
            catch (System.Exception ex)
            {
                  //HelperEvent.OnMessageColor?.Invoke("二进制文件反序列化错误:" + ex.ToString(), Color.Red,"Main");
                  MessageBox.Show("二进制文件反序列化错误:" + fileName + ex.ToString(),"Main");
            }
          }
      }
      return obj;
}
#endregion


      #region Json 格式
            /// <summary>
            /// 反序列化json文件
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns>反序列化后的类对象通过泛型限定</returns>
            public static T DeserializeJson<T>(string fileName)
            {
                  T obj = default(T);
                  try
                  {
                      if (!File.Exists(fileName)) return obj;
                      return JsonConvert.DeserializeObject<T>(File.ReadAllText(fileName));
                  }
                  catch (Exception ex)
                  {
                      //HelperEvent.OnMessageColor?.Invoke("Json文件序列化错误: " + ex.ToString(), Color.Red, "Main");
                  }
                  return obj;
            }

            /// <summary>
            /// 序列化json文件
            /// </summary>
            /// <typeparam name="T">序列化限定的泛型</typeparam>
            /// <param name="fileName">文件路径</param>
            public static void SerializeJson<T>(T obj, string fileName) where T : class
            {
                  try
                  {
                      string dir = fileName.Substring(0, fileName.LastIndexOf('\\'));
                      if (!Directory.Exists(dir))
                      {
                        Directory.CreateDirectory(dir);
                      }
                      var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
                      var json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, jsonSetting);
                      File.WriteAllText(fileName, json);
                  }
                  catch (Exception ex)
                  {
                      //HelperEvent.OnMessageColor?.Invoke("Json文件反序列化错误: " + ex.ToString(), Color.Red, "Main");
                  }
            }


            #endregion


            #region XML格式
                  /// <summary>
                  ///
                  ///《/summary>
                  /// <typeparam name="T">限定的泛型类型</typeparam>
                  /// <param name="fileName">文件路径</param>
                  /// <param name="obj">序列化的对象</param>
                  /// <param name="omitXmlDeclaration">是否需要xml版本描述</param>
                  /// <param name="removeDefaultNameSpace">是否从新开始添加</param>
                  public static void XmlSerialize<T>(string fileName, T obj, bool omitXmlDeclaration, bool removeDefaultNameSpace)
                  {
                        try
                        {
                            XmlWriterSettings xmlSetting = new XmlWriterSettings();
                            xmlSetting.OmitXmlDeclaration = omitXmlDeclaration;
                            xmlSetting.Indent = true;
                            xmlSetting.Encoding = new UTF8Encoding(false);
                            xmlSetting.NewLineChars = Environment.NewLine;
                            using (XmlWriter xmlWriter = XmlWriter.Create(fileName, xmlSetting))
                            {
                              XmlSerializerNamespaces xmlms = new XmlSerializerNamespaces();
                              if (removeDefaultNameSpace)
                              {
                                    xmlms.Add(string.Empty, string.Empty);
                              }
                              XmlSerializer ser = new XmlSerializer(typeof(T));
                              ser.Serialize(xmlWriter, obj, xmlms);
                            }
                        }
                        catch (Exception ex)
                        {
                            //HelperEvent.OnMessageColor?.Invoke("XML文件序列化错误: " + ex.ToString(), Color.Red, "Main");
                        }
                  }

                  /// <summary>
                  /// xml反序列化
                  /// </summary>
                  /// <typeparam name="T">限定的泛型类型</typeparam>
                  /// <param name="fileName">文件路径</param>
                  /// <returns>返回限定的泛型类</returns>
                  public static T XmlDeserialize<T>(string fileName) where T : class
                  {
                        try
                        {
                            XmlReaderSettings xmlReaderSetting = new XmlReaderSettings();
                            xmlReaderSetting.CloseInput = true;
                            using (XmlReader xmlReader = XmlReader.Create(fileName, xmlReaderSetting))
                            {
                              XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                              return (T)xmlSerializer.Deserialize(xmlReader);
                            }
                        }
                        catch (Exception ex)
                        {
                            //HelperEvent.OnMessageColor?.Invoke("XML文件反序列化错误: " + ex.ToString(), Color.Red, "Main");
                            return null;
                        }
                  }

                #endregion

    }对象序列化需要在类上面加上
https://img2023.cnblogs.com/blog/2360143/202301/2360143-20230112092755895-19756921.png
调用:path是程序的exe目录,data是序列化文件的
https://img2023.cnblogs.com/blog/2360143/202301/2360143-20230112093215742-1987895026.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: WPF-序列化