C#-序列化与反序列化(xml、json)

目录

 一、序列化

1、Json序列化、反序列化

2、Xml序列化、反序列化  

二、扩展(只做了解)

1、序列到指定xml文件内 

2、查找并更新Xml文件内容 

3、获取xml文件中的内容 


 一、序列化

1、Json序列化、反序列化

方式一:使用Newtonsoft.Json安装包(推荐1

               System.Text.Json(推荐2)

常用方法:

JsonConvert.SerializeObject()                //序列化

JsonConvert.DeserializeObject<T>()          //反序列化 

方式二:使用DataContractJsonSerializer

        注意:  序列化类要添加[DataContract]特性

                     序列化类成员要添加[DataMember]特性

   DataContractJsonSerializer json= new DataContractJsonSerializer(typeof(List<JsonTest>));
   using (MemoryStream ms = new MemoryStream())
   {
     json.WriteObject(ms, jsonTests);
     res=Encoding.UTF8.GetString(ms.ToArray());
   }
   tbox.Text = res;

        反序列化用ReadObject()方法

2、Xml序列化、反序列化  

  1. 引入命名空间System.Xml.Serialization;
  2. 创建XmlSerializer类实例(通过构造函数指定类型);
  3. 使用Serialize()方法序列化;
  4. 使用Deserialize()方法反序列化
  XmlSerializer xml = new XmlSerializer(jsonTests.GetType());
  var path = Path.Combine(Directory.GetCurrentDirectory(), @"../../Xml", "mydata.xml");
  using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
  {
     xml.Serialize(fs, jsonTests);      //Xml序列化   
  }
  using (FileStream fs = new FileStream(path, FileMode.Open))
  {
    //XmlReader reader = new XmlTextReader(fs);
     var data = xml.Deserialize(fs) as List<JsonTest>;         //Xml反序列化
     tbox2.Text = data[0].Name +"\n"+ data[0].Value;
  }

二、扩展(只做了解)

1、序列到指定xml文件内 

实例化一个XmlSerializer对象,通过实例对象的Serialize()方法将指定类序列化到一个指定路径下的xml文件。 

示例代码 :

        /// <summary>
        /// 序列化一个类到指定路径下的xml文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name"></param>
        /// <returns>序列化成功返回success,失败返回错误信息</returns>
        public static string SerializeXml<T>(T name)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                string path = Path.Combine(Environment.CurrentDirectory,@"..\..\Data\data.xml");
                StreamWriter xsw = new StreamWriter(path);
                serializer.Serialize(xsw, name);
                /***************扩展:序列化类为xml,返回序列化后的字符串
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                MemoryStream stream = new MemoryStream();
                byte[] buffer =stream.ToArray();
                string xml = Encoding.ASCII.GetString(buffer); 
                stream.Close();
                string xml = GetXml.GetXmlServer();
                return xml;
                *********************/
                xsw.Close();
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            return "success";
        }

2、查找并更新Xml文件内容 

1、使用XmlDocument创建一个实例对象xmldoc;

2、使用xmldoc的Load()方法加载一个xml文件路径;

3、通过xmldoc的SelectSingleNode()查找一个指定节点;

4、获取该节点的所有孩子节点到节点列表;

5、遍历节点列表(要将XmlNode转化成XmlElement类型使用);

6、更新数据后保存;

示例代码:

        public void SaveData(MainWinModelView modelview)
        {
            string xmlfilename = System.IO.Path.Combine(Environment.CurrentDirectory, @"Data\MyData.xml");
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(xmlfilename);
            XmlNode node = xmldoc.SelectSingleNode("Products");
            XmlNodeList node1s = node.ChildNodes;
            string product="product"+modelview.SelectedIndex.ToString();
            foreach (XmlNode node1 in node1s)
            {
                XmlElement xelem1 = node1 as XmlElement;
                if (xelem1.GetAttribute("Name") == product)
                {
                    XmlNodeList node2s = xelem1.ChildNodes;
                    foreach (XmlNode node2 in node2s)
                    { 
                        XmlElement xelem2 = node2 as XmlElement;
                        if (xelem2.Name == "name")
                            xelem2.InnerText = modelview.Name;
                        else if(xelem2.Name=="description")
                            xelem2.InnerText = modelview.Description;
                        else if(xelem2.Name=="Image_path")
                            xelem2.InnerText=modelview.Image_path.ToString();
                    }
                    break;
                }
            }
            xmldoc.Save(xmlfilename);
            MessageBox.Show("Save success!");
        }

3、获取xml文件中的内容 

通过XDocument类方式获取 

示例代码: 

        public List<Product> GetProducts() 
        {
            string xmlfilename=System.IO.Path.Combine(Environment.CurrentDirectory,@"Data\MyData.xml");
            List<Product> productList = new List<Product>();
            XDocument xDocument = XDocument.Load(xmlfilename);
            var pros = xDocument.Descendants("product");
            foreach (var pro in pros)
            { 
                Product product = new Product();
                product.Name = pro.Element("name").Value;
                product.Description = pro.Element("description").Value;
                product.Image_path=pro.Element("Image_path").Value;
                productList.Add(product);
            }
            return productList;
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中的XML序列化反序列化是常用的技术,可以将对象转化为便于传输的XML格式,并且可以将XML格式的数据还原为对象。其中,XML序列化可以使用多种方式实现,比如二进制、字节数组、JSON字符串和XML字符串等。在C#中,可以使用XmlSerializer类的Serialize方法将对象序列化XML字符串,使用Deserialize方法将XML字符串反序列化为对象。\[1\] 在进行XML序列化时,可以通过设置XmlTextWriter的Formatting属性为Formatting.Indented来实现换行显示,使得生成的XML字符串更加可读。另外,需要注意的是,Dictionary本身不支持序列化,所以需要重写为可序列化的SerializableDictionary类来实现对字典的序列化操作。\[2\] 对于XML反序列化为对象,可以使用deserialize方法来实现。该方法接受一个XML字符串和一个类型参数,通过使用XmlSerializer类的Deserialize方法将XML字符串反序列化为指定类型的对象。在反序列化过程中,需要使用StringReader将XML字符串转化为可读的流,并使用XmlSerializer类进行反序列化操作。\[3\] #### 引用[.reference_title] - *1* *2* *3* [C# XML序列化反序列化(XmlSerializer)](https://blog.csdn.net/sD7O95O/article/details/128783513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值