首页 > 其他分享 >数据保存

数据保存

时间:2024-12-31 14:44:22浏览次数:1  
标签:xml heaters 保存 path new 数据 public serializer

  1. XML反序列读取(只存储有标记的属性)
点击查看代码
public static class Util
    {
        public static void SerializeToXml<T>(T objectToSerialize, string path)
        {
            try
            {
                // 创建 DataContractSerializer 实例  
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));

                var dir = Path.GetDirectoryName(path);
                Directory.CreateDirectory(dir);

                using (MemoryStream ms = new MemoryStream())
                {
                    using (XmlWriter writer = XmlWriter.Create(ms, new XmlWriterSettings { Encoding = Encoding.UTF8 }))
                    {
                        serializer.WriteObject(writer, objectToSerialize);
                    }

                    ms.Seek(0, SeekOrigin.Begin); // 重置流的位置到开头

                    using (XmlReader reader = XmlReader.Create(ms))
                    {
                        // 使用XDocument作为中间步骤来加载XML,然后转换为XmlDocument
                        XDocument xDoc = XDocument.Load(reader);
                        XmlDocument xmlDoc = new XmlDocument();
                        xmlDoc.Load(xDoc.CreateReader());
                        if (File.Exists(path))
                        {
                            File.Delete(path);
                        }
                        xmlDoc.Save(path);
                    }
                }
            }
            catch (Exception ex)
            {

                throw new Exception($"Fail To Save, [{path}]。", ex);
            }
        }

        public static T DeserializeFromXml<T>(string path)
        {
            try
            {
                // 创建 DataContractSerializer 实例  
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));

                // 反序列化 XML 为 MyClass 对象(可选)  
                T deserializedObject;
                using (XmlReader reader = XmlReader.Create(path))
                {
                    deserializedObject = (T)serializer.ReadObject(reader);
                }

                return deserializedObject;
            }
            catch (Exception ex)
            {

                throw new Exception($"Fail To Deserialize, [{path}]。", ex);
            }
        }

    }
用法
点击查看代码
[DataContract]
    public class Heater
    {
        [DataMember]
        public double TargetTemperature { get; set; }
        [DataMember]
        public bool Enable { get; set; } = true;
    }
	
	[DataContract]
    public class HeaterManager
    {
        private readonly List<IHeater> heaters;
        private readonly string savePath;

        public HeaterManager(IHeater[] heaters)
        {
            this.heaters = new List<IHeater>(heaters);
            this._alarmBus = alarmBus;
            this.log = LogManager.GetLogger("OperationLogger");
            this.savePath = Path.Combine(PathManager.DataProjectPath, $"Heaters.xml");
            if (File.Exists(this.savePath))
            {
                var hm = Domain.Util.DeserializeFromXml<HeaterManager>(this.savePath);
                var heaterDatas = hm.HeaterDatas;
                foreach (var heater in heaters)
                {
                    var data = heaterDatas.Find(x => x.Name == heater.Name);
                    if (data != null)
                    {
                        heater.TargetTemperature = data.TargetTemperature;
                    }
                }
            }
            else
            {
                this.HeaterDatas = new List<Heater>();
                foreach (var heater in heaters)
                {
                    this.HeaterDatas.Add(heater as Heater);
                }
                this.Save();
            }
        }

        [DataMember]
        public List<Heater> HeaterDatas { get; set; }

        public IEnumerable<IHeater> Heaters => this.heaters;
        public void Save()
        {
            Util.SerializeToXml(this, this.savePath);
        }
    }

2、XML反序列读取(列表类中所有属性保存)

点击查看代码
public class Class_to_xml
    {
        //实体类转换XML,xml序列化
        public static string XmlSerialize<T>(T obj)
        {
            using (StringWriter sw = new StringWriter())
            {
                Type t = obj.GetType();
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(sw, obj);
                sw.Close();
                return sw.ToString();
            }
        }
        //xml反序列化
        public static T DESerializer<T>(string strXML) where T : class
        {
            try
            {
                using (StringReader sr = new StringReader(strXML))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(sr) as T;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

用法

点击查看代码
 #region 列表集合
             //测试集合
             List<Student> list = new List<Student>()
            {
                    new Student(){Id=1,Name="小红",Sex='2',Age=20},
                    new Student(){Id=2,Name="小明",Sex='1',Age=22},
                    new Student(){Id=3,Name="小王",Sex='1',Age=19},
                    new Student(){Id=4,Name="测试",Sex='2',Age=23}
            };
             //序列化为xml
             string strXML = Class_to_xml.XmlSerialize<List<Student>>(list);
             Console.Write(strxml);

             //反序列化为list
             List<Student> listStu = Class_to_xml.DESerializer<List<Student>>(strXML);
             foreach (var item in listStu)
             {
                 Console.WriteLine(item.Age);
             }
             #endregion

标签:xml,heaters,保存,path,new,数据,public,serializer
From: https://www.cnblogs.com/diena/p/18643750

相关文章

  • Socket传输结构数据
    转自:https://www.cnblogs.com/stemon/p/4204950.html 最近在做一个机器人项目,要实时的接收机器人传回的坐标信息,并在客户端显示当前的地图和机器人的位置。当然坐标的回传是用的Socket,用的是C++的结构体表示的坐标信息。但是C#不能像C++那样很easy的把字节数组byte[]直接的转换......
  • java JSONObject序列化包含Date类型数据的Java对象
    javaJSONObject序列化包含Date类型数据的Java对象|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|------......
  • JavaSpring AI与阿里云通义大模型的集成使用Java Data Science Library(JDSL)进行数据处
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站学习总结1、掌握JAVA入门到进阶知识(持续写作中……)2、学会Oracle数据库入门到入土用法(创作中……)3、手把手教你开发炫酷的vbs脚本制作(完善中……)4、牛逼哄哄的IDEA......
  • 让项目数据一目了然的10款项目管理软件推荐
    在当今快节奏的商业环境中,项目管理已经成为企业成功的关键因素之一。无论是小型团队还是大型企业,高效的项目管理工具都能帮助团队更好地规划、执行和监控项目进度。然而,面对市场上琳琅满目的项目管理软件,如何选择一款适合自己团队的工具,往往让人感到困惑。本文将为您推荐10款功能......
  • 如何确保CSV文件读取过程中数据完整?
    确保CSV文件读取过程中数据完整,需要考虑以下几个方面:错误处理:检查文件是否成功打开。检查每次读取操作是否成功。处理可能的I/O异常。数据验证:验证每一行的数据是否符合预期格式。检查每行的列数是否一致。验证数据类型是否正确(例如,日期格式、数值范围等)。处理......
  • KingbaseES 数据库备份恢复案例之---sys_rman备份进程异常
    案例说明:执行sys_rman物理备份时,读取backup.info、backup.info.copy文件失败,sys_rman进程异常,无法正常结束服务,进程无法退出,阻塞新的备份任务。适用版本:KingbaseESV8R6一、问题现象如下所示,sys_rman备份结束时,读取backup.info、backup.info.copy文件失败,sys_rman进程异常:......
  • 【分布式数据库与数据存储方案】详解
    分布式数据库与数据存储方案一、分布式数据库概述(一)概念分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统,这些节点通过网络进行连接和通信,对外呈现出一个统一的逻辑数据库,用户或应用程序可以像操作传统的单一数据库一样与之交互,但其内部通过一系列复杂的......
  • ABAP 常用数据库表
    在写增强、程序、或者取后台数据的时候会用到很多表,这里做下记录。字段都是以  字段名数据类型描述 方式进行表示。MM模块MARA 常规物料数据物料主数据中的各个字段的存储表KEY:MATNR MATNR 物料编号常用字段:MTART MTART 物料类型MAKT 物料描述KEY:MATN......
  • LVGL-C 实现一个文件持久性缓存,用于存储配置相关数据
    实现功能描述:基于linux嵌入式平台开发App,在未移植数据库的情况下,文件存储是一个不错的持久性数据存储手段。创建代码文件:configcache.hconfigcache.c1.数据结构的结构体封装点击查看代码//配置信息结构typedefstruct{char*key;char*v......
  • 【数据清洗秘籍】如何避免Pandas中的科学计数法陷阱
    在数据分析的世界里,数据清洗是一项不可或缺的工作。我们经常需要将数据从一种格式转换为另一种格式,以适应分析的需求。然而,在处理数值数据时,一个常见的问题就是数值被自动转换为科学计数法,尤其是当数值非常大时。这不仅影响了数据的可读性,还可能对后续的分析造成影响:譬如无法关联......