4.1.1 类的序列化与反序列化(XmlSerializer)

本文介绍XML序列化和反序列化操作

本例子中被序列化的类(Devices)中有一个List,其元素类型为:DigitalInputInfo. 序列化以及反序列化都很简单:

序列化:即把类的对象输出到文件中。

StreamWriter streamWriter = new StreamWriter(filePath);

XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();

xmlSerializerNamespaces.Add("", "");

XmlSerializer xmlSerializer = new XmlSerializer(sourceObj.GetType());

xmlSerializer.Serialize(streamWriter, sourceObj, xmlSerializerNamespaces);

streamWriter.Close();

return true;

反序列化:从文件中加载生成类的对象。

StreamReader streamReader = new StreamReader(filePath);

XmlSerializer xmlSerializer = new XmlSerializer(type ?? typeof(T));

obj = xmlSerializer.Deserialize(streamReader);

streamReader.Close();

具体效果以及代码如下:

一、效果如下

生成的序列化文件打开后如下:

二、具体代码:

cs 复制代码
public static bool SaveToXml_FileName<T>(string filePath, T sourceObj)
{
    if (!string.IsNullOrEmpty(filePath) && sourceObj != null)
    {
        try
        {
            StreamWriter streamWriter = new StreamWriter(filePath);
            XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();
            xmlSerializerNamespaces.Add("", "");
            XmlSerializer xmlSerializer = new XmlSerializer(sourceObj.GetType());
            xmlSerializer.Serialize(streamWriter, sourceObj, xmlSerializerNamespaces);
            streamWriter.Close();
            return true;
        }
        catch (Exception ex)
        {
            Log.Error(ex);

        }
    }
    return false;
}
cs 复制代码
public static T LoadFromXml_FileName<T>(string filePath, Type type = null)
{
    object obj = null;
    try
    {
        StreamReader streamReader = new StreamReader(filePath);
        XmlSerializer xmlSerializer = new XmlSerializer(type ?? typeof(T));
        obj = xmlSerializer.Deserialize(streamReader);
        streamReader.Close();
    }
    catch (Exception ex)
    {
        Log.Error(ex);
    }
    return (obj == null) ? default(T) : ((T)obj);
}
cs 复制代码
  public class DigitalInputInfo
  {
      private bool isOn = false;
      public int Id { get; set; } = 0;
      public string Name { get; set; } = string.Empty;
      public int IndexByte { get; set; } = 0;
      public int IndexBit { get; set; } = 0;
}
public class Devices 
{ 
	public List<DigitalInputInfo> digitalInputInfos = new List<DigitalInputInfo>();
}

main()
{
Devices    instance = new Devices();
DigitalInputInfo info1 = new DigitalInputInfo()
{
    Id = 1,
    IndexByte = 1,
    IndexBit = 1
};
DigitalInputInfo info2 = new DigitalInputInfo()
{
    Id = 2,
    IndexByte = 3,
    IndexBit = 4
};
instance.digitalInputInfos.Add(info1);
instance.digitalInputInfos.Add(info2);
instance.Save();
}
相关推荐
八九燕来1 个月前
使用django的DRF业务逻辑应该放在序列化器类还是模型类
django·序列化·业务逻辑
平谷一勺1 个月前
golang中的结构体
开发语言·后端·golang·序列化·结构体·结构体嵌套·匿名结构体嵌套
A尘埃4 个月前
权限注解+AOP切面+额外工具(UUID生成id,JWT,Servlet客户端,字符串String工具类,Redis序列化,ip工具类)
redis·servlet·注解·aop·序列化
大数据张老师4 个月前
使用Python pickle模块进行序列化
服务器·python·php·序列化·反序列化
脸红ฅฅ*的思春期5 个月前
Java安全—原生反序列化&重写方法&链条分析&触发类
java·安全·序列化·反序列化
PersistJiao5 个月前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
梦想画家5 个月前
用Rust中byteorder包高效处理字节序列
rust·序列化·byteorder·文件编码
梦想画家5 个月前
快速学习Serde包实现rust对象序列化
开发语言·rust·序列化
Winston Wood6 个月前
Android Parcelable和Serializable的区别与联系
android·序列化