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

    }

对象序列化需要在类上面加上[Serializable]

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

posted @ 2023-01-12 10:10  小red裤  阅读(321)  评论(0编辑  收藏  举报