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();
}
相关推荐
小韩学长yyds1 个月前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
嗯嗯**1 个月前
Neo4j学习2:概念、数据展示、CQL使用
数据库·学习·neo4j·数据存储·图数据库·序列化·cql
没有bug.的程序员2 个月前
Java 序列化:Serializable vs. Protobuf 的性能与兼容性深度对比
java·开发语言·后端·反射·序列化·serializable·protobuf
liangsheng_g2 个月前
泛型新认知
java·序列化·泛型
charlee443 个月前
C++中JSON序列化和反序列化的实现
c++·json·序列化·结构体·nlohmann/json
程序员三明治3 个月前
【Java基础】序列化到底是什么?有什么用?实现原理?
java·开发语言·后端·java基础·序列化·反序列化
Irene19913 个月前
Worker 对象 与 DedicatedWorkerGlobalScope 实例对比(附:序列化、结构化克隆算法、循环引用 解释)
序列化·worker对象
梵得儿SHI5 个月前
Java IO 流深度解析:对象流与序列化机制(ObjectInputStream/ObjectOutputStream)
java·开发语言·rpc·序列化·对象流·对象与字节流的转换·java对象流
Ronin3055 个月前
【Linux网络】应用层自定义协议
linux·网络·应用层·序列化