系列化保存数据-一般采用BinaryFormatter 方式进行,其可实现二进制存储,文件相对较小,如果存储的数据内有包含多个引用类(即类嵌套其他类),保存数据相对会大一些,且在反编译的时候内存需求较大;
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
#region 系列化处理
/// <summary>
/// 系列化对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
public static void SerializeObje<T>(string filePath, T obj)
{
try
{
using (FileStream stream = new FileStream(filePath, FileMode.Create))
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
}
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 反系列化处理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filePath"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static T DeserializeObj<T>(string filePath, T obj)
{
T temp = default(T);
try
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
IFormatter formatter = new BinaryFormatter();
temp = (T)formatter.Deserialize(fileStream);
}
}
catch (Exception)
{
}
return temp;
}
#endregion
[Serializable]
public class BasePData : ISerializable, IDeserializationCallback
{
public BasePData(int _ip, string name)
{
this.iP = _ip;
ProductionName = name;
for (int i = 0; i < 10; i++)
{
lasers.Add(new LaserProductionPara(i, DateTime.Now.ToString() + i.ToString()));
}
}
public int iP { get; set; }
public string ProductionName { get; set; }
public List<LaserProductionPara> lasers { get; set; } = new List<LaserProductionPara>();
protected BasePData(SerializationInfo info, StreamingContext context)
{
iP = info.GetInt32(nameof(iP));
ProductionName = info.GetString(nameof(ProductionName));
lasers = (List<LaserProductionPara>)info.GetValue(nameof(lasers), typeof(List<LaserProductionPara>));
Console.WriteLine($"反系列化:BasePData_iP{iP}");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(iP), iP);
info.AddValue(nameof(ProductionName), ProductionName);
info.AddValue(nameof(lasers), lasers);
Console.WriteLine($"系列化:BasePData_iP{iP}");
}
public void OnDeserialization(object sender)
{
foreach (var item in lasers)
{
Console.WriteLine(item.LaserProductionName);
}
}
}
[Serializable]
public class LaserProductionPara : ISerializable
{
public LaserProductionPara(int ip, string name)
{
this.LaseriP = ip;
this.LaserProductionName = name;
}
public int LaseriP { get; set; }
public string LaserProductionName { get; set; }
protected LaserProductionPara(SerializationInfo info, StreamingContext context)
{
LaseriP = info.GetInt32(nameof(LaseriP));
LaserProductionName = info.GetString(nameof(LaserProductionName));
Console.WriteLine($"反系列化:LaserProductionPara_LaseriP{LaseriP}");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(LaseriP), LaseriP);
info.AddValue(nameof(LaserProductionName), LaserProductionName);
Console.WriteLine($"系列化:LaserProductionPara_LaseriP{LaseriP}");
}
} }