C# xml序列化和反序列化

问题

有的项目使用webservice返回结果是xml,需要进行xml序列化和反序列化

xml序列化相关特性

C#中,XML序列化相关的特性主要包括:

  • XmlIgnore:这个特性可以用来指示序列化过程忽略一个属性或一个字段。当使用XmlIgnore特性时,被标记的属性或字段将不会被序列化到XML。
  • XmlAttribute:这个特性可以用来指示序列化过程将一个属性或字段作为一个XML属性而不是元素。
  • XmlElement:这个特性可以用来指定序列化过程将一个属性或字段作为一个XML元素。
  • XmlText:这个特性可以用来指定序列化过程将一个属性或字段的值作为XML文本节点。
  • XmlType:这个特性可以用来指定序列化过程为类或结构体生成一个特定的XML类型名称。
  • XmlRoot:这个特性可以用来指定序列化过程的根元素名称和可选的命名空间。
  • XmlAccessType:这个特性可以用来指定属性或字段的访问类型,以控制它们在序列化过程中是否可读或可写。这些特性可以在类、属性或字段上使用,以控制C#对象如何被序列化为XML。

案例代码

XmlHelper.cs

using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace XmlStu02
{
    /// 
    /// xml帮助类
    /// 
    public class XmlHelper
    {
        /// 
        /// 对象转化为xml字符串,如果有参数为null则不进行序列化
        /// 
        /// 
        /// 是否进行格式化
        /// 是否需要xml请求头
        /// 
        public static string ObjectToXmlString(object obj, bool isNeedHeader = false, bool isFormat = false)
        {
            try
            {
                XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Encoding = new UTF8Encoding(false);//utf-8不带BOM //Encoding.UTF8;utf-8带BOM
                if (isFormat)
                {
                    settings.Indent = true;
                    settings.IndentChars = "    ";
                    settings.NewLineChars = "\r\n";
                }
                if (!isNeedHeader)
                {
                    settings.OmitXmlDeclaration = true;  // 不生成声明头
                }
                using (var memoryStream = new MemoryStream())
                using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings))
                {
                    // 强制指定命名空间,覆盖默认的命名空间
                    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                    namespaces.Add(string.Empty, string.Empty);
                    xmlSerializer.Serialize(xmlWriter, obj, namespaces);
                    var xmlString = Encoding.UTF8.GetString(memoryStream.ToArray());
                    return xmlString;
                };
            }
            catch
            {
                return string.Empty;
            }
        }

        /// 
        /// 将XML数据反序列化为对象
        /// 
        /// 
        /// 
        /// 
        public static T? XmlStringToObject<T>(string xmlData) where T : class
        {
            // 创建XmlSerializer实例  
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            // 使用XmlReader读取XML并反序列化为Person对象  
            using (StringReader reader = new StringReader(xmlData))
            {
                XmlReader xmlReader = XmlReader.Create(reader);
                T? result = serializer.Deserialize(xmlReader) as T;
                return result;
            }
        }
    }
}

FriendModel

using System.Xml.Serialization;

namespace XmlStu02
{
    /// 
    /// 好朋友
    /// 
    [XmlRoot("FRIEND")]
    public class FriendModel
    {
        /// 
        /// 姓名
        /// 
        [XmlAttribute("NAME")]
        public string? Name { get; set; }

        /// 
        /// 性别
        /// 
        [XmlAttribute("SEX")]
        public string? Sex { get; set; }
    }
}

ChildModel

using System.Xml.Serialization;

namespace XmlStu02
{
    /// 
    /// 孩子模型
    /// 
    [XmlRoot("CHILD")]
    public class ChildModel
    {
        /// 
        /// 姓名
        /// 
        [XmlElement("NAME")]
        public string? Name { get; set; }

        /// 
        /// 出生日期
        /// 
        [XmlElement("BIRTHDAY")]
        public string? BirthDay { get; set; }

        /// 
        /// 好朋友有多个
        /// 
        [XmlElement("FRIEND")]
        public List<FriendModel>? Friends { get; set; }
    }
}

ParentModel

using System.Xml.Serialization;

namespace XmlStu02
{
    /// 
    /// 父类模型
    /// 
    [XmlRoot("PARENT")]
    public class ParentModel
    {
        /// 
        /// 姓名
        /// 
        [XmlElement("NAME")]
        public string? Name { get; set; }

        /// 
        /// 出生日期
        /// 
        [XmlElement("BIRTHDAY")]
        public string? BirthDay { get; set; }

        /// 
        /// 孩子,有多个
        /// 
        [XmlElement("CHILDREN")]
        public List<ChildModel>? Children { get; set; }
    }
}

测试

using System.Text.Json;

namespace XmlStu02
{
    internal class Program
    {
        /// 
        /// 程序入口方法
        /// 
        /// 
        static void Main(string[] args)
        {
            var friend = new FriendModel();
            friend.Name = "小明";
            friend.Sex = "男";
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(XmlHelper.ObjectToXmlString(friend, true, true));
            var child = new ChildModel();
            child.Name = "大孩子";
            child.BirthDay = null;
            child.Friends = new List<FriendModel>() {
                friend,
                new FriendModel()
                {
                     Name="小红",
                     Sex="女"
                }
            };
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(XmlHelper.ObjectToXmlString(child, true, true));
            var parnent = new ParentModel();
            parnent.Name = "父亲";
            parnent.BirthDay = "1970-10-01";
            parnent.Children = new List<ChildModel>()
            {
                child,
                 new ChildModel()
                 {
                      Name="小孩子",
                      BirthDay="1995-02-18"
                 }
            };
            Console.ForegroundColor = ConsoleColor.Blue;
            var parentXml = XmlHelper.ObjectToXmlString(parnent, true, true);
            Console.WriteLine(parentXml);
            var xmlParent = XmlHelper.XmlStringToObject<ParentModel>(parentXml);
            if (xmlParent != null)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("xml反序列化成功");
                Console.ForegroundColor = ConsoleColor.Magenta;
                var jsonConfig = new JsonSerializerOptions
                {
                    WriteIndented = true, // 可选,仅用于格式化输出  
                    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
                };
                Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(xmlParent, jsonConfig));
            }
            Console.ForegroundColor = ConsoleColor.White;
        }
    }
}

C# xml序列化和反序列化_第1张图片

你可能感兴趣的:(dotnet,c#,xml,java)