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();
}
相关推荐
songyuc5 天前
Python序列化的学习笔记
序列化
好易学·数据结构8 天前
可视化图解算法36: 序列化二叉树-I(二叉树序列化与反序列化)
数据结构·算法·leetcode·二叉树·力扣·序列化·牛客
梁云亮9 天前
Jquery ajax 提交序列化或JSON数据到后台
json·jquery·序列化
大Mod_abfun15 天前
VB.net序列化和反序列化的使用方法和实用场景
序列化·vb.net·反序列化
不吃肘击15 天前
SpringMVC中自定义消息转换器处理响应和请求时的Json数据序列化的格式
java·spring·json·序列化·反序列化·消息转换器
八九燕来2 个月前
使用django的DRF业务逻辑应该放在序列化器类还是模型类
django·序列化·业务逻辑
平谷一勺2 个月前
golang中的结构体
开发语言·后端·golang·序列化·结构体·结构体嵌套·匿名结构体嵌套
A尘埃5 个月前
权限注解+AOP切面+额外工具(UUID生成id,JWT,Servlet客户端,字符串String工具类,Redis序列化,ip工具类)
redis·servlet·注解·aop·序列化
大数据张老师5 个月前
使用Python pickle模块进行序列化
服务器·python·php·序列化·反序列化