通过XmlSerializer 实现XML的序列化与反序列化

通过XmlSerializer 我们可以十分简单的将Model与XML进行转换

官文在点这里

帮助类

  1 using System;
  2 using System.Text;
  3 using System.Xml.Serialization;
  4 using System.IO;
  5 using System.Xml;
  6
  7 namespace BLL
  8 {
  9     public class XmlHelper
 10     {
 11         public static T DeSerializeModels<T>(string XMLStr, string eleName)
 12         {
 13             XmlRootAttribute Root = new XmlRootAttribute();
 14             Root.ElementName = eleName;
 15
 16             XmlSerializer xs = new XmlSerializer(typeof(T), Root);
 17
 18             StringReader strReader = new StringReader(XMLStr);
 19             System.Xml.XmlReader r = new System.Xml.XmlTextReader(strReader);
 20             try
 21             {
 22                 T Result = (T)xs.Deserialize(r);
 23                 return Result;
 24             }
 25             finally
 26             {
 27                 strReader.Close();
 28                 r.Close();
 29             }
 30         }
 31
 32         public static string SerializeModels<T>(T Models,string eleName)
 33         {
 34             StringBuilder sb = new StringBuilder();
 35             StringWriter w = new StringWriter(sb);
 36
 37             XmlRootAttribute Root = new XmlRootAttribute();
 38             Root.ElementName = eleName;
 39
 40             XmlSerializer sr = new XmlSerializer(typeof(T), Root);
 41             sr.Serialize(w, Models);
 42
 43             w.Close();
 44
 45             return sb.ToString();
 46         }
 47
 48         private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
 49         {
 50             if (o == null)
 51                 throw new ArgumentNullException("o");
 52             if (encoding == null)
 53                 throw new ArgumentNullException("encoding");
 54
 55             XmlSerializer serializer = new XmlSerializer(o.GetType());
 56
 57             XmlWriterSettings settings = new XmlWriterSettings();
 58             settings.Indent = true;
 59             settings.NewLineChars = "\r\n";
 60             settings.Encoding = encoding;
 61             settings.IndentChars = "    ";
 62
 63             using (XmlWriter writer = XmlWriter.Create(stream, settings))
 64             {
 65                 serializer.Serialize(writer, o);
 66                 writer.Close();
 67             }
 68         }
 69
 70         /// <summary>
 71         /// 将一个对象序列化为XML字符串
 72         /// </summary>
 73         /// <param name="o">要序列化的对象</param>
 74         /// <param name="encoding">编码方式</param>
 75         /// <returns>序列化产生的XML字符串</returns>
 76         public static string XmlSerialize(object o, Encoding encoding)
 77         {
 78             using (MemoryStream stream = new MemoryStream())
 79             {
 80                 XmlSerializeInternal(stream, o, encoding);
 81
 82                 stream.Position = 0;
 83                 using (StreamReader reader = new StreamReader(stream, encoding))
 84                 {
 85                     return reader.ReadToEnd();
 86                 }
 87             }
 88         }
 89
 90         /// <summary>
 91         /// 将一个对象序列化为XML字符串
 92         /// </summary>
 93         /// <param name="o">要序列化的对象</param>
 94         /// <returns>序列化产生的XML字符串</returns>
 95         public static string XmlSerialize(object o)
 96         {
 97             return XmlSerialize(o, Encoding.UTF8);
 98         }
 99
100         /// <summary>
101         /// 将一个对象按XML序列化的方式写入到一个文件
102         /// </summary>
103         /// <param name="o">要序列化的对象</param>
104         /// <param name="UploadPath">保存文件路径</param>
105         /// <param name="encoding">编码方式</param>
106         public static void XmlSerializeToFile(object o, string path, Encoding encoding)
107         {
108             if (string.IsNullOrEmpty(path))
109                 throw new ArgumentNullException("path");
110
111             using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write))
112             {
113                 XmlSerializeInternal(file, o, encoding);
114             }
115         }
116
117         /// <summary>
118         /// 将一个对象按XML序列化的方式写入到一个文件
119         /// </summary>
120         /// <param name="o">要序列化的对象</param>
121         /// <param name="UploadPath">保存文件路径</param>
122         public static void XmlSerializeToFile(object o, string path)
123         {
124             XmlSerializeToFile(o, path, Encoding.UTF8);
125         }
126
127         /// <summary>
128         /// 从XML字符串中反序列化对象
129         /// </summary>
130         /// <typeparam name="T">结果对象类型</typeparam>
131         /// <param name="s">包含对象的XML字符串</param>
132         /// <param name="encoding">编码方式</param>
133         /// <returns>反序列化得到的对象</returns>
134         public static T XmlDeserialize<T>(string s, Encoding encoding)
135         {
136             if (string.IsNullOrEmpty(s))
137                 throw new ArgumentNullException("s");
138             if (encoding == null)
139                 throw new ArgumentNullException("encoding");
140
141             XmlSerializer xs = new XmlSerializer(typeof(T));
142             using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
143             {
144                 using (StreamReader sr = new StreamReader(ms, encoding))
145                 {
146                     return (T)xs.Deserialize(sr);
147                 }
148             }
149         }
150
151         /// <summary>
152         /// 从XML字符串中反序列化对象
153         /// </summary>
154         /// <typeparam name="T">结果对象类型</typeparam>
155         /// <param name="s">包含对象的XML字符串</param>
156         /// <returns>反序列化得到的对象</returns>
157         public static T XmlDeserialize<T>(string s)
158         {
159             return XmlDeserialize<T>(s, Encoding.UTF8);
160         }
161
162         /// <summary>
163         /// 读入一个文件,并按XML的方式反序列化对象。
164         /// </summary>
165         /// <typeparam name="T">结果对象类型</typeparam>
166         /// <param name="UploadPath">文件路径</param>
167         /// <param name="encoding">编码方式</param>
168         /// <returns>反序列化得到的对象</returns>
169         public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
170         {
171             if (string.IsNullOrEmpty(path))
172                 throw new ArgumentNullException("path");
173             if (encoding == null)
174                 throw new ArgumentNullException("encoding");
175
176             string xml = File.ReadAllText(path, encoding);
177             return XmlDeserialize<T>(xml, encoding);
178         }
179
180         /// <summary>
181         /// 读入一个文件,并按XML的方式反序列化对象。
182         /// </summary>
183         /// <typeparam name="T">结果对象类型</typeparam>
184         /// <param name="UploadPath">文件路径</param>
185         /// <returns>反序列化得到的对象</returns>
186         public static T XmlDeserializeFromFile<T>(string path)
187         {
188             return XmlDeserializeFromFile<T>(path, Encoding.UTF8);
189         }
190     }
191 }

工具类

同时也可以通过设置Model的特性,灵活的控制序列化

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

namespace Model
{
    /// <summary>
    /// 节点名是EleTeacher
    /// </summary>
    [Serializable]
    [XmlType("EleTeacher")]
    public class Teacher
    {
        [XmlElement(ElementName = "user")]
        public string AuthorID { set; get; }

        [XmlIgnore]
        public string Content { set; get; }

        [XmlText]
        public string Value { set; get; }

        [XmlArray("students")]
        public List<Student> sds { set; get; }
    }

    [Serializable]
    public class Student
    {
        [XmlAttribute(AttributeName = "id")]
        public string ID { set; get; }

        [XmlText]
        public string Name { set; get; }
    }
}

Model

通过XmlSerializer 实现XML的序列化与反序列化

时间: 2024-10-12 05:32:57

通过XmlSerializer 实现XML的序列化与反序列化的相关文章

C#实现复杂XML的序列化与反序列化

这篇文章主要介绍了C#实现复杂XML的序列化与反序列化的方法,是非常实用的一个技巧,需要的朋友可以参考下 本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法.分享给大家供大家参考.具体方法如下: 已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象. Default.XML文件如下: <?xml version="1.0" encoding="utf-8" ?> <config> <rule

C#XML的序列化与反序列化

要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name;}set{name=value;}}public string Sex;public int Age=31;public Course[] Courses; public Person(){}public Person(string Name){name=Name;Sex="男";} }[

多层级XML的序列化和反序列化

CODING中经常遇到序列化多层级的XML,例如下面这种,假设名字是“Default.xml”,和Program.cs在同一文件夹下 <?xml version="1.0" encoding="utf-8" ?> <config> <rules> <rule name="namea"> <params> <item name="p" type="get

C# XML对象序列化、反序列化 - PEPE YU

http://www.tuicool.com/articles/IjE7ban XML 序列化:可以将对象序列化为XML文件,或者将XML文件反序列化为对象还有种方法 使用LINQ TO XML或者反序列化的方法从XML中读取数据. 最简单的方法就是 .net framework提供的,只需要定义好xml数据格式,定义好对象即可. 1.调用方法: using RenosData.RDBao.EvidenceUploadModel.Models; using RenosData.RDBao.Evi

C#.net XML的序列化与反序列化

/// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化的对象</param> /// <param name="encoding">编码方式</param> /// <returns>序列化产生的XML字符串</returns> public static string Seria

XML序列化与反序列化+自定义XML注解框架XmlUtils

背景 前面一篇总结了Serializable的序列化与反序列化,现在接着总结XML.主要内容:XML基本的序列化与反序列化方法.一些注意事项.以及自定义了一个XML注解框架(简洁代码,解放双手). XML的序列化与反序列化 先与Serializable进行简单的对比: Serializable存储的文件,打开后无法正常查看,安全性高.xml文件可通过文本编辑器查看与编辑,可读性高(浏览器会格式化xml文件,更方便查看),安全性低: Serializable文件通过了签名,只能在自己的程序中反序列

C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

序列化和反序列化代码

1.UserInfo对象类 [Serializable] public class UserInfo { public string Name { get; set; } public int Age { get; set; } } 2.Xml方式序列化和反序列化 public class XmlSerialization { public static void XmlSerialize(UserInfo user) { XmlSerializer serializer = new XmlSe

12.C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:  对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的