zoukankan      html  css  js  c++  java
  • XML序列化与反序列化(续)

      前段时间写了一个关于XML序列化和反序列化的(http://www.cnblogs.com/EddyPeng/archive/2012/07/27/2611835.html),最近突然发现一个问题,就是当XML节点值为空时,序列化后的XML节点会是这种形式的<node />。但是我们如果需要<node></node>这种形式的该如何写呢。先看看代码吧

      工具类和测试对象

    public class XmlTextWriterTest : XmlTextWriter
        {
            public XmlTextWriterTest(Stream w, Encoding encoding)
                : base(w, encoding)
            {
            }
            public XmlTextWriterTest(TextWriter w)
                : base(w)
            { }
            public XmlTextWriterTest(string filename, Encoding encoding)
                : base(filename, encoding)
            { }
    
            public override void WriteEndElement()
            {
                base.WriteFullEndElement();
            }
        }
    
        public static class Utility
        {
            public static string XMLSerialization(object obj)
            {
                string result = string.Empty;
    
                if (obj != null)
                {
                    try
                    {
                        XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
    
                        xmlns.Add(string.Empty, string.Empty);
    
                        XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
    
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            XmlTextWriterTest writer = new XmlTextWriterTest(memoryStream, Encoding.Default);
    
                            writer.Formatting = Formatting.Indented;
    
                            xmlSerializer.Serialize(writer, obj, xmlns);
    
                            writer.Flush();
                            writer.Close();
                            
                            result = Encoding.Default.GetString(memoryStream.ToArray());
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
    
                return result;
            }
    
            public static T XMLDeSerialization<T>(string xml)
            {
                T result = default(T);
    
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
    
                try
                {               
                    using (StringReader stringReader = new StringReader(xml))
                    {
                        result = (T)xmlSerializer.Deserialize(stringReader);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
    
                return result;
            }
        }
    
        [Serializable]
        [XmlRoot("school")]
        public class TestObject
        {
            [XmlAttribute("descri")]
            public string descri = "Eddy's xml serializaion demo";
    
            [XmlElement("English")]
            public English english;
    
            [XmlElement("Chinese")]
            public Chinese chinese;
        }
    
        public class English
        {
            [XmlElement("Teacher")]
            public string Teacher = string.Empty;
    
            [XmlElement("Room")]
            public string Room = "202";
        }
    
        public class Chinese
        {
            [XmlElement("Teacher")]
            public string Teacher = "Eddy";
    
            [XmlElement("Room")]
            public string Room = "203";
    
            [XmlElement("Students")]
            public Students students;
        }
    
        public class Students
        {
            [XmlElement("Student")]
            public List<Student> student;
        }
    
        public class Student
        {
            [XmlAttribute("Name")]
            public string Name = string.Empty;
    
            [XmlAttribute("No")]
            public string No = string.Empty;
    
            [XmlAttribute("Age")]
            public string Age = "19";
        }

      调用示例

                TestObject obj = new TestObject()
                {
                    chinese = new Chinese()
                    {
                        students = new Students()
                        {
                            student = new List<Student>(){
                               new Student(),
                               new Student()
                            }
                        }
                    },
                    english = new English()
                };
    
                string xml = Utility.XMLSerialization(obj);
    
                TestObject obj1 = Utility.XMLDeSerialization<TestObject>(xml);
    

      达到目的的关键就是下面这一部分代码,没错,重写了WriteEndElement方法。从字面意思可以看出,它就是用来写完整的结束标志,如:<node></node>的。  

    public override void WriteEndElement()
            {
                base.WriteFullEndElement();
            }
    

      好了,去看电影了,雨果看了半集,继续。

  • 相关阅读:
    c编写程序完成m名旅客和n辆汽车的同步程序代写
    [原]web服务器:SOAP,WSDL,UDDI
    用多进程同步方法演示“桔子-苹果”问题
    实验教学管理系统 c语言程序代写源码下载
    模拟游客一天的生活与旅游java程序代写源码
    Java作业代写
    快餐店运行模拟C++程序源码代写
    求可能组合VB源码代写
    深入源码分析Java线程池的实现原理
    ThreadLocal原理详解
  • 原文地址:https://www.cnblogs.com/EddyPeng/p/2664360.html
Copyright © 2011-2022 走看看