Xml CDATA 序列化

来源:互联网 发布:厦大网络继续教育学院 编辑:程序博客网 时间:2024/05/22 14:39
namespace Test{    using System;    using System.IO;    using System.Text;    using System.Xml;    using System.Xml.Serialization;    using Test.Share;    using Microshaoft;    public class Class1    {        static void Main(string[] args)        {            ServiceBusXmlMessage message = new ServiceBusXmlMessage();            MessageSecurityHeader security = new MessageSecurityHeader();            security.SenderID = "sender001";            security.Signature = "asdasdsadsa";            security.SignTimeStamp = "asdasdsa";            Router router = new Router();            router.Topic = "Topic01";            router.From = "From01";            router.FromReferenceID = "11111111111111";            router.To = new string[] { "to01", "to02", "to03" };            Encoding e = Encoding.UTF8;            e = Encoding.GetEncoding("gb2312");            MemoryStream stream = new MemoryStream();            XmlTextWriter writer = new XmlTextWriter(stream, e);            XmlSerializer serializer = new XmlSerializer(router.GetType());            string xml = SerializerHelper.ObjectToXml<Router>                                                    (                                                        router                                                        , writer                                                        , serializer                                                    );            message.RoutersHeader = new CDATA(xml);            message.SecurityHeader = security;            SampleBody sampleBody = new SampleBody();            sampleBody.TimeStamp = "sadadsad";            sampleBody.AreaNo = "Area1";            sampleBody.ChannelNo = "CH1";            stream = new MemoryStream();            writer = new XmlTextWriter(stream, e);            serializer = new XmlSerializer(sampleBody.GetType());            xml = SerializerHelper.ObjectToXml<SampleBody>                                                    (                                                        sampleBody                                                        , writer                                                        , serializer                                                    );            message.Body = new CDATA(xml);            stream = new MemoryStream();            writer = new XmlTextWriter(stream, e);            serializer = new XmlSerializer(message.GetType());            xml = SerializerHelper.ObjectToXml<ServiceBusXmlMessage>                                                    (                                                        message                                                        , writer                                                        , serializer                                                    );            Console.WriteLine("Xml序列化:");            Console.WriteLine(xml);            Console.WriteLine("Xml反序列化:");            ServiceBusXmlMessage message2 = SerializerHelper.XmlToObject<ServiceBusXmlMessage>(xml);            Console.WriteLine(message2.SecurityHeader.SenderID);            Console.WriteLine("hi: " + message2.RoutersHeader.InnerSourceXml);            Console.WriteLine("hi: " + message2.RoutersHeader.InnerXml);            Console.WriteLine("body: " + message2.Body.OuterXml);            Console.WriteLine("body: " + message2.Body.InnerXml);            Router router2 = SerializerHelper.XmlToObject<Router>(message2.RoutersHeader.InnerXml);            Console.WriteLine(router2.To[0]);            SampleBody sampleBody2 = SerializerHelper.XmlToObject<SampleBody>(message2.Body.InnerXml);            Console.WriteLine(sampleBody2.AreaNo);            //Console.WriteLine("Hello World");            //Console.WriteLine(Environment.Version.ToString());            Console.ReadLine();        }    }}namespace Test.Share{    using System;    using System.Xml;    using System.Xml.Schema;    using System.Xml.Serialization;    [XmlRoot("ServiceBusXmlMessage")]    [Serializable]    public class ServiceBusXmlMessage    {        [XmlElement("Security", typeof(MessageSecurityHeader))]        public MessageSecurityHeader SecurityHeader;        [XmlElement("Routers", typeof(CDATA))]        public CDATA RoutersHeader;        [XmlElement("Body", typeof(CDATA))]        public CDATA Body;    }    [Serializable]    public class MessageSecurityHeader    {        [XmlAttribute("SenderID")]        public string SenderID;        [XmlAttribute("Signature")]        public string Signature;        [XmlAttribute("SignTimeStamp")]        public string SignTimeStamp;    }    [Serializable]    public class Router    {        [XmlAttribute("Topic")]        public string Topic;        [XmlAttribute("From")]        public string From;        [XmlAttribute("FromReferenceID")]        public string FromReferenceID;        [XmlElement("To", typeof(string))]        public string[] To;    }    [Serializable]    public class SampleBody    {        [XmlAttribute("TimeStamp")]        public string TimeStamp;        [XmlElement("AreaNo")]        public string AreaNo;        [XmlElement("ChannelNo")]        public string ChannelNo;    }    public class CDATA : IXmlSerializable    {        public CDATA()        {        }        public CDATA(string xml)        {            this._outerXml = xml;        }        private string _outerXml;        public string OuterXml        {            get            {                return _outerXml;            }        }        private string _innerXml;        public string InnerXml        {            get            {                return _innerXml;            }        }        private string _innerSourceXml;        public string InnerSourceXml        {            get            {                return _innerXml;            }        }        XmlSchema IXmlSerializable.GetSchema()        {            return null;        }        void IXmlSerializable.ReadXml(XmlReader reader)        {            string s = reader.ReadInnerXml();            string startTag = "<![CDATA[";            string endTag = "]]>";            char[] trims = new char[] { '\r', '\n', '\t', ' ' };            s = s.Trim(trims);            if (s.StartsWith(startTag) && s.EndsWith(endTag))            {                s = s.Substring(startTag.Length, s.LastIndexOf(endTag) - startTag.Length);            }            this._innerSourceXml = s;            this._innerXml = s.Trim(trims);        }        void IXmlSerializable.WriteXml(XmlWriter writer)        {            writer.WriteCData(this._outerXml);        }    }}namespace Microshaoft{    using System;    using System.IO;    using System.Text;    using System.Xml;    using System.Xml.Serialization;    using System.Runtime.Serialization.Formatters.Binary;    public static class SerializerHelper    {        public static T XmlToObject<T>(string Xml)        {            StringReader stringReader = new StringReader(Xml);            XmlReader xmlReader = XmlReader.Create(stringReader);            XmlSerializer serializer = new XmlSerializer(typeof(T));            return (T)serializer.Deserialize(xmlReader);        }        public static string ObjectToXml<T>                                    (                                        T Object                                        , XmlTextWriter writer                                        , XmlSerializer serializer                                    )        {            serializer.Serialize(writer, Object, null);            MemoryStream stream = writer.BaseStream as MemoryStream;            byte[] bytes = stream.ToArray();            Encoding e = EncodingHelper.IdentifyEncoding                                            (                                                bytes                                                , Encoding.GetEncoding("gb2312")                ///                                                , new Encoding[]                ///                                                        {                ///                                                            Encoding.UTF8                ///                                                            , Encoding.Unicode                ///                                                        }                                            );            byte[] buffer = e.GetPreamble();            int offset = buffer.Length;            buffer = new byte[bytes.Length - offset];            Buffer.BlockCopy(bytes, offset, buffer, 0, buffer.Length);            string s = e.GetString(buffer);            return s;        }        public static string ObjectToXml<T>(T Object, Encoding e)        {            XmlSerializer serializer = new XmlSerializer(typeof(T));            using (MemoryStream stream = new MemoryStream())            {                XmlTextWriter writer = new XmlTextWriter(stream, e);                string s = ObjectToXml<T>                                    (                                        Object                                        , writer                                        , serializer                                    );                writer.Close();                writer = null;                return s;            }        }        public static byte[] ObjectToBinary<T>                                    (                                        T Object                                    )        {            using (MemoryStream stream = new MemoryStream())            {                BinaryFormatter formater = new BinaryFormatter();                formater.Serialize(stream, Object);                byte[] buffer = stream.ToArray();                return buffer;            }        }        public static T BinaryToObject<T>                                    (                                        byte[] data                                    )        {            using (MemoryStream stream = new MemoryStream())            {                BinaryFormatter formater = new BinaryFormatter();                stream.Write(data, 0, data.Length);                stream.Position = 0;                T Object = (T)formater.Deserialize(stream);                return Object;            }        }    }}namespace Microshaoft{    using System.IO;    using System.Text;    using System.Collections.Generic;    public static class EncodingHelper    {        public static Encoding IdentifyEncoding                                    (                                        Stream stream                                        , Encoding defaultEncoding                                        , Encoding[] identifyEncodings                                    )        {            byte[] data = StreamDataHelper.ReadDataToBytes(stream);            return IdentifyEncoding                        (                            data                            , defaultEncoding                            , identifyEncodings                        );        }        public static Encoding IdentifyEncoding                                    (                                        Stream stream                                        , Encoding defaultEncoding                                    )        {            byte[] data = StreamDataHelper.ReadDataToBytes(stream);            return IdentifyEncoding                        (                            data                            , defaultEncoding                        );        }        public static Encoding IdentifyEncoding                                    (                                        byte[] data                                        , Encoding defaultEncoding                                    )        {            EncodingInfo[] encodingInfos = Encoding.GetEncodings();            List<Encoding> list = new List<Encoding>();            foreach (EncodingInfo info in encodingInfos)            {                Encoding e = info.GetEncoding();                if (e.GetPreamble().Length > 0)                {                    list.Add(e);                    //System.Console.WriteLine(e.EncodingName);                }            }            Encoding[] encodings = new Encoding[list.Count];            list.CopyTo(encodings);            return IdentifyEncoding                        (                            data                            , defaultEncoding                            , encodings                        );        }        public static Encoding IdentifyEncoding                                    (                                        byte[] data                                        , Encoding defaultEncoding                                        , Encoding[] identifyEncodings                                    )        {            Encoding encoding = defaultEncoding;            foreach (Encoding e in identifyEncodings)            {                byte[] buffer = e.GetPreamble();                int l = buffer.Length;                if (l == 0)                {                    continue;                }                bool flag = false;                for (int i = 0; i < l; i++)                {                    if (buffer[i] != data[i])                    {                        flag = true;                        break;                    }                }                if (flag)                {                    continue;                }                else                {                    encoding = e;                }            }            return encoding;        }    }}namespace Microshaoft{    using System.IO;    public static class StreamDataHelper    {        public static byte[] ReadDataToBytes(Stream stream)        {            byte[] buffer = new byte[64 * 1024];            MemoryStream ms = new MemoryStream();            int r = 0;            int l = 0;            long position = -1;            if (stream.CanSeek)            {                position = stream.Position;                stream.Position = 0;            }            while (true)            {                r = stream.Read(buffer, 0, buffer.Length);                if (r > 0)                {                    l += r;                    ms.Write(buffer, 0, r);                }                else                {                    break;                }            }            byte[] bytes = new byte[l];            ms.Position = 0;            ms.Read(bytes, 0, (int)l);            ms.Close();            ms.Dispose();            ms = null;            if (position >= 0)            {                stream.Position = position;            }            return bytes;        }    }}


0 0
原创粉丝点击