使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解

使用 C# 对象将 WinRiver 项目文件进行 XML 序列化和反序列化的实例详解

  • 一、序列化和反序列化的目的
  • 二、WinRiver 的项目 MMT 文件架构示例
  • 三、以 WinRiver 为对象进行 C# 代码编程
    • 3.1 声明 WinRiver 对象
    • 3.2 声明 Project 对象
    • 3.3 声明 Site_Information 对象
    • 3.4 声明 Site_Discharge 对象
    • 3.5 声明 QA_QC 、Collect_Data 、DisplaySettings 对象
    • 3.6 声明 Transect 、 Discharge_Summary 、File 、Configuration 对象
    • 3.7 其它省略内容的子类
    • 3.8 测试创建项目文件(包含序列化和反序列化)
    • 3.9 执行创建文件
    • 3.10 输出 XML 效果
  • 四、说明
  • 五、完整 WinRiver 类文件下载

一、序列化和反序列化的目的

1、以对象编程,简化程序代码。
2、以对象编程,对程序配置文件实施简单的读写。

二、WinRiver 的项目 MMT 文件架构示例

WinRiver 的项目 MMT 文件,是 RDI ADCP 的测量项目记录,包含很多设置。



  
    False
    
      汉口分局
      中国
      湖北
      武汉
       
    
    
      
        XHZ20240806_22_000_24-08-06.PD0
        XHZ20240806_22_000_24-08-06_ASC.TXT
        XHZ20240806_22_000_24-08-06_EH.TXT
        XHZ20240806_22_000_24-08-06_GPS.TXT
        
          
              
          
          
              
          
          
              
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
        
        
          
              
          
          
              
          
          
              
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
          
               
          
        
      
      
             
      
      
              
      
    
    
             
    
    
                 
    
    
      
        18.000000
      
    
  

三、以 WinRiver 为对象进行 C# 代码编程

创建新的类,命名为 WinRiverXML。

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace 命名空间
{
    public class WinRiverXML
    {
     //将 3.1 - 3.8 的代码内容放入
    }
}

3.1 声明 WinRiver 对象

        /// WinRiver根目录
        [XmlRoot("WinRiver")]
        public class WinRiver
        {
            /// 项目
            [XmlElement("Project")]
            public Project Project { get; set; }
        }

3.2 声明 Project 对象

        /// 项目
        public class Project
        {
            /// 名称属性
            [XmlAttribute("Name")]
            public string Name { get; set; } = "Text.mmt";
            /// 版本属性
            [XmlAttribute("Version")]
            public string Version { get; set; } = "1.0.0.2";
            /// 标志属性
            [XmlAttribute("Flags")]
            public string Flags { get; set; } = "0";
            /// 锁定标志
            [XmlElement("Locked")]
            public string Locked { get; set; } = "False";
            /// 测站信息
            [XmlElement("Site_Information")]
            public Site_Information Site_Information { get; set; }
            /// 测站流量
            [XmlElement("Site_Discharge")]
            public Site_Discharge Site_Discharge { get; set; }
            /// 质量控制
            [XmlElement("QA_QC")]
            public QA_QC QA_QC { get; set; }
            /// 采集数据
            [XmlElement("Collect_Data")]
            public Collect_Data Collect_Data { get; set; }
             /// 显示设置
            [XmlElement("DisplaySettings")]
            public DisplaySettings DisplaySettings { get; set; }
        }

3.3 声明 Site_Information 对象

       /// 测站信息
        public class Site_Information
        {
            /// 类型
            [XmlAttribute("Type")]
            public string Type { get; set; } = "1";
            /// 复选
            [XmlAttribute("Checked")]
            public string Checked { get; set; } = "1";
            /// 类型
            [XmlAttribute("Status")]
            public string Status { get; set; } = "0";
            /// 错误
            [XmlAttribute("Error")]
            public string Error { get; set; } = "0";
            /// 测验单位
            public string Agency { get; set; }
            /// 国家
            public string Country { get; set; }
            /// 
            public string State { get; set; }
            /// 
            public string County { get; set; }

            //省略其它信息代码
        }

3.4 声明 Site_Discharge 对象

        /// 测站流量
        public class Site_Discharge
        {
            /// 类型
            [XmlAttribute("Type")]
            public string Type { get; set; } = "2";
            /// 复选
            [XmlAttribute("Checked")]
            public string Checked { get; set; } = "1";
            /// 状态
            [XmlAttribute("Status")]
            public string Status { get; set; } = "0";
            /// 错误
            [XmlAttribute("Error")]
            public string Error { get; set; } = "0";
            /// 断面测回
            [XmlElement("Transect")]
            public List<Transect> Transect { get; set; }
            /// 断面流量汇总
            [XmlElement("Discharge_Summary")]
            public Discharge_Summary Discharge_Summary { get; set; }
        }

3.5 声明 QA_QC 、Collect_Data 、DisplaySettings 对象

        /// 质量控制
        public class QA_QC
         { 
          //省略其它内容代码
         }
        /// 采集数据
        public class Collect_Data
         {
           //省略其它内容代码
         }
        /// 显示设置
        public class DisplaySettings
        {  
          //省略其它内容代码
        }

3.6 声明 Transect 、 Discharge_Summary 、File 、Configuration 对象

        /// 断面
        public class Transect
        {
            /// 类型
            [XmlAttribute("Type")]
            public string Type { get; set; } = "5";
            /// 复选
            [XmlAttribute("Checked")]
            public string Checked { get; set; } = "1";
            /// 状态
            [XmlAttribute("Status")]
            public string Status { get; set; } = "0";
            /// 全选
            [XmlAttribute("SelectAll")]
            public string SelectAll { get; set; } = "1";
            /// 第一集合
            [XmlAttribute("First")]
            public string First { get; set; }
            /// 最后集合
            [XmlAttribute("Last")]
            public string Last { get; set; }
            /// 错误
            [XmlAttribute("Error")]
            public string Error { get; set; } = "0";
            /// 文件
            [XmlElement("File")]
            public List<File> File { get; set; }
            /// 配置
            [XmlElement("Configuration")]
            public List<Configuration> Configuration { get; set; }
        }
        /// 文件
        public class File
        {
            /// 路径名称
            [XmlAttribute("PathName")]
            public string PathName { get; set; }
            /// 类型
            [XmlAttribute("Type")]
            public string Type { get; set; }
            /// 断面号
            [XmlAttribute("TransectNmb")]
            public string TransectNmb { get; set; }
            /// 名称
            [XmlText]
            public string Name { get; set; }
        }
        /// 配置
        public class Configuration
        {
            /// 类型
            [XmlAttribute("Type")]
            public string Type { get; set; } = "7";
            /// 复选
            [XmlAttribute("Checked")]
            public string Checked { get; set; } = "1";
            /// 状态
            [XmlAttribute("Status")]
            public string Status { get; set; } = "0";
            /// 错误
            [XmlAttribute("Error")]
            public string Error { get; set; } = "0";
            /// 命令
            [XmlElement("Commands")]
            public Commands Commands { get; set; }
            /// 声速仪
            [XmlElement("Depth_Sounder")]
            public Depth_Sounder Depth_Sounder { get; set; }
            /// 外接罗经
            [XmlElement("Ext_Heading")]
            public Ext_Heading Ext_Heading { get; set; }
            /// GPS
            [XmlElement("GPS")]
            public GPS GPS { get; set; } = new GPS();
            /// 流量
            [XmlElement("Discharge")]
            public Discharge Discharge { get; set; }
            /// 边坡估算
            [XmlElement("Edge_Estimates")]
            public Edge_Estimates Edge_Estimates { get; set; }
            /// 偏移量
            [XmlElement("Offsets")]
            public Offsets Offsets { get; set; }
            /// 处理
            [XmlElement("Processing")]
            public Processing Processing { get; set; }
            /// 记录
            [XmlElement("Recording")]
            public Recording Recording { get; set; }
            /// 向导信息
            [XmlElement("Wizard_Info")]
            public Wizard_Info Wizard_Info { get; set; }
            /// DM过滤
            [XmlElement("DMFilter")]
            public DMFilter DMFilter { get; set; }
        }

3.7 其它省略内容的子类

       /// 流量汇总
        public class Discharge_Summary { }
        /// 命令
        public class Commands { }
        /// 声速仪
        public class Depth_Sounder { }
        /// 外接罗经
        public class Ext_Heading { }
        /// GPS
        public class GPS { }
        /// 流量
        public class Discharge { }
        /// 边坡估算
        public class Edge_Estimates { }
        /// 偏移量
        public class Offsets { }
        /// 处理
        public class Processing { }
        /// 记录
        public class Recording { }
        /// 向导信息
        public class Wizard_Info { }
        /// DM过滤
        public class DMFilter { }

3.8 测试创建项目文件(包含序列化和反序列化)

  public static void CreateFile()
        {
            WinRiver winRiver = new WinRiver();

            Project project = new Project
            {
                Name = "新文件.MMT",
                Version = "2.24.0.8",
                Locked = "False",
                Flags = "0"
            };

            Site_Information SiteInformation = new Site_Information
            {
                Type = "1",
                Checked = "1",
                Status = "0",
                Error = "0",
                Agency = "汉口水文分局",
                Country = "中国",
                County = "武汉市"
            };

            Site_Discharge SiteDischarge = new Site_Discharge
            {
                Type = "2",
                Checked = "1",
                Status = "0",
                Error = "0"
            };

            Transect Transect0 = new Transect
            {
                Type = "5",
                Checked = "1",
                Status = "0",
                SelectAll = "1",
                First = "0",
                Last = "0",
                Error = "0"
            };

            File FilePD0 = new File
            {
                PathName = "D:\\TEST\\新文件\\新文件_000.PD0",
                Type = "6",
                Name = "新文件_000.PD0",
                TransectNmb = "0"
            };

            File FileASC0 = new File
            {
                PathName = "D:\\TEST\\新文件\\新文件_000.ASC.TXT",
                Type = "14",
                Name = "新文件_000.ASC.TXT",
                TransectNmb = "0"
            };

            File FileEH0 = new File
            {
                PathName = "D:\\TEST\\新文件\\新文件_000.EH.TXT",
                Type = "13",
                Name = "新文件_000.EH.TXT",
                TransectNmb = "0"
            };

            File FileGPS0 = new File
            {
                PathName = "D:\\TEST\\新文件\\新文件_000.GPS.TXT",
                Type = "11",
                Name = "新文件_000.GPS.TXT",
                TransectNmb = "0"
            };

            Transect0.File = new List<File>
            {
                FilePD0,
                FileASC0,
                FileEH0,
                FileGPS0
            };

            Configuration configuration = new Configuration
            {
                Commands = new Commands(),
                Depth_Sounder = new Depth_Sounder(),
                Ext_Heading = new Ext_Heading(),
                Discharge = new Discharge(),
                Edge_Estimates = new Edge_Estimates(),
                Offsets = new Offsets(),
                Processing = new Processing(),
                Recording = new Recording(),
                Wizard_Info = new Wizard_Info(),
                DMFilter = new DMFilter()
            };

            Transect0.Configuration = new List<Configuration>
            {
                configuration
            };

            SiteDischarge.Transect = new List<Transect>
            {
                Transect0
            };

            SiteDischarge.Discharge_Summary = new Discharge_Summary();

            project.Site_Information = SiteInformation;
            project.Site_Discharge = SiteDischarge;

            QA_QC qA_QC = new QA_QC();
            Collect_Data collect_Data = new Collect_Data();
            DisplaySettings displaySettings = new DisplaySettings();

            project.QA_QC = qA_QC;
            project.Collect_Data = collect_Data;
            project.DisplaySettings = displaySettings;

            winRiver.Project = project;



            Console.WriteLine();
            Console.WriteLine("WinRiver对象序列化为XML字符串----------------控制台显示--------------------");
            string xml;
            XmlSerializer serializer = new XmlSerializer(typeof(WinRiver));//序列化WinRiver对象
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");//命名空间设为空,不显示 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            using (StringWriter writer = new StringWriter())
            {
                serializer.Serialize(writer, winRiver, ns);//序列化为 StringWriter 的 xml 字符串
                xml = writer.ToString();

                Console.WriteLine(xml);//控制台显示
            }

            Console.WriteLine();
            Console.WriteLine("WinRiver对象序列化为XML文件--------------------------------------------");
            string ConfigFile = Environment.CurrentDirectory + "\\TestWinRiverMMT.XML";

            using (FileStream fileStream = new FileStream(ConfigFile, FileMode.Create))
            {
                serializer.Serialize(fileStream, winRiver, ns);//序列化为文件流FileStream,保存到文件
            }

            Console.WriteLine();
            Console.WriteLine("XML 字符串反序列化为 WinRiver 对象--------------------------------------");
            // 从XML反序列化为对象  
            WinRiver newWinRiver;
            using (StringReader reader = new StringReader(xml))
            {
                newWinRiver = (WinRiver)serializer.Deserialize(reader);//将 xml 字符串反序列化为WinRiver对象
            }

            Console.WriteLine(newWinRiver.Project.Name);//控制台显示WinRiver对象的值
            Console.WriteLine(newWinRiver.Project.Version);
            Console.WriteLine(newWinRiver.Project.Flags);
            Console.WriteLine(newWinRiver.Project.Locked);

            Console.WriteLine();
            Console.WriteLine("XML 文件反序列化为 WinRiver 对象--------------------------------------------");
            WinRiver New_WinRiver;
            XmlSerializer New_serializer = new XmlSerializer(typeof(WinRiver));// 创建XmlSerializer实例,指定要反序列化的类型

            using (FileStream fileStream = new FileStream(ConfigFile, FileMode.Open))
            {
                New_WinRiver = (WinRiver)New_serializer.Deserialize(fileStream);//将文件流反序列化为 WinRiver 对象
            }

            Console.WriteLine(New_WinRiver.Project.Name);
            Console.WriteLine(New_WinRiver.Project.Version);
            Console.WriteLine(New_WinRiver.Project.Flags);
            Console.WriteLine(New_WinRiver.Project.Locked);
        }

3.9 执行创建文件

    private void SaveProjectMenu_Click(object sender, EventArgs e)
        {
           WinRiverXML.CreateFile();
        }

3.10 输出 XML 效果

WinRiver对象序列化为XML字符串----------------控制台显示--------------------



  
    False
    
      汉口水文分局
      中国
      武汉市
    
    
      
        新文件_000.PD0
        新文件_000.ASC.TXT
        新文件_000.EH.TXT
        新文件_000.GPS.TXT
        
          
          
          
          
          
          
          
          
          
          
          
        
      
      
    
    
    
    
  


WinRiver对象序列化为XML文件--------------------------------------------

XML 字符串反序列化为 WinRiver 对象--------------------------------------
新文件.MMT
2.24.0.8
0
False

XML 文件反序列化为 WinRiver 对象--------------------------------------------
新文件.MMT
2.24.0.8
0
False

四、说明

为了减少篇幅,以上代码省略部分,可以自行类推添加完整。程序在框架 .NET Framework、C# 2017编程环境下,测试正确完成。

五、完整 WinRiver 类文件下载

https://download.csdn.net/download/zyyujq/91445436

你可能感兴趣的:(C#,序列化和反序列化,MMT,c#,xml,序列化和反序列化,属性的序列化和反序列化,完整序列化,ADCP和WinRiver)