C# XML 序列化和反序列化

本文介绍了一种使用C#实现的XML序列化和反序列化方法,通过自定义对象与XML字符串之间的转换,实现了数据的有效存储和读取。文章详细展示了序列化过程中的关键步骤,包括创建XmlSerializer实例、使用MemoryStream进行数据流操作、以及通过StringBuilder收集XML字符串。同时,也介绍了如何从XML字符串中反序列化出原始对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 public class XmlUtility
    {
        /// <summary>
        /// 将自定义对象序列化为XML字符串
        /// </summary>
        /// <param name="myObject">自定义对象实体</param>
        /// <returns>序列化后的XML字符串</returns>
        public static string SerializeToXml<T>(T myObject)
        {
            if (myObject != null)
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));

                MemoryStream stream = new MemoryStream();
                XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
                writer.Formatting = Formatting.None;//缩进
                xs.Serialize(writer, myObject);

                stream.Position = 0;
                StringBuilder sb = new StringBuilder();
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        sb.Append(line);
                    }
                    reader.Close();
                }
                writer.Close();
                return sb.ToString();
            }
            return string.Empty;
        }

        /// <summary>
        /// 将XML字符串反序列化为对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="xml">XML字符</param>
        /// <returns></returns>
        public static T DeserializeToObject<T>(string xml)
        {
            T myObject;
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            StringReader reader = new StringReader(xml);
            myObject = (T)serializer.Deserialize(reader);
            reader.Close();
            return myObject;
        }
    }

 

XML Sample - 1

<message>
	<header transactionID="1234567890">
	</header>
	<body>
		<cart ID="pre_1000" serial="27301 * -AIW - 1511 - 0124"/>
		<operation operator="Tom" timestamp="2008-07-17T15:26:59+05:30" type="1"/>
		<products>
			<product mixID="AUD-PRD1"/>
			<product mixID="AUD-PRD5"/>
		</products>
		<material id="ABC0011"/>
		<position p1="40010R" p2="-1" p3="10" p4="1"/>
	</body>
</message>

对应的Object 

    [Serializable]
    public class message
    {
        public object header { get; set; }
        public bodyC body = new bodyC();

        [Serializable]
        public class bodyC
        {
            [XmlElementAttribute("cart")]
            public object cart { get; set; }

            [XmlElementAttribute("operation")]
            public object operation { get; set; }

            [XmlArrayAttribute("products")]
            public product[] products { get; set; }

            [XmlRootAttribute("MyProduct")]
            public class product
            {
                [XmlAttribute("mixID")]
                public string mixID { get; set; }
            }

            [XmlElementAttribute("material")]
            public materialC material { get; set; }
            [Serializable]
            public class materialC
            {
                [XmlAttribute("id")]
                public string id { get; set; }
            }
            [XmlElementAttribute("position")]
            public object position { get; set; }
        }
    }

调用实例

string XMLString = XmlUtility.SerializeToXml(_SocketXML_590Req);

XmlFactory590Req.message _SocketXML_590Req = XmlUtility.DeserializeToObject<XmlFactory590Req.message>(XMLString);

 

 

 

 

XML Sample - 2

<root>
  <Header>
    <SystemName>OTHERSYSTEM</SystemName>
    <SystemVersion>1.00</SystemVersion>
    <SessionId>29961</SessionId>
    <CommandName>ProgramDataSend</CommandName>
  </Header>
  <ProgramDataSend>
    <Element>
      <Date>2020/07/26,02:20:29</Date>
      <MCNo>1</MCNo>
    </Element>
    <Element>
      <Date>2020/07/26,02:20:29</Date>
      <MCNo>1</MCNo>
    </Element>
  </ProgramDataSend>
</root>

对应的Object

        public class ProgramDataSendXml
        {
            [Serializable]
            public class root
            {
                public headerC Header = new headerC();
                public ProgramDataSendC ProgramDataSend { get; set; }
                public root()
                {
                    Header.CommandName = "ProgramDataSend";
                }
            }


            public class ProgramDataSendC
            {
                [XmlElementAttribute("Element")]
                public List<Element> ElementList { get; set; }

                [SerializableAttribute()]
                [XmlTypeAttribute(AnonymousType = true)]
                [XmlRootAttribute("Element", IsNullable = false)]
                public class Element {
                    [XmlElementAttribute("Date")]
                    public string Date { get; set; }
                    [XmlElementAttribute("MCNo")]
                    public string MCNo { get; set; }
                }
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值