Maison > développement back-end > Tutoriel XML/RSS > Explication détaillée du code graphique de la sérialisation XML

Explication détaillée du code graphique de la sérialisation XML

黄舟
Libérer: 2017-03-21 16:20:57
original
2040 Les gens l'ont consulté

 XMLLa sérialisation est le processus de conversion des propriétés publiques et des champs d'un objet au format XML pour le stockage ou la transmission. La désérialisation recrée l'état d'origine de l'objet à partir de la sortie XML. La classe la plus importante dans la sérialisation XML est la classe XmlSerializer. Ses méthodes les plus importantes sont les méthodes Serialize et Deserialize, qui se trouvent dans l'espace de noms System.Xml.Serialization.

1. Points de base de la sérialisation XML

Avant de commencer cette section, regardons d'abord l'exemple le plus simple :

namespace 学习测试
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person(1, "刘备", 176);
            string xmlString = "";
            //xml序列化开始
            using (MemoryStream ms = new MemoryStream())
            {
                Type t = p.GetType();
                XmlSerializer xml = new XmlSerializer(t);
                xml.Serialize(ms, p);
                byte[] arr = ms.ToArray();
                xmlString = Encoding.UTF8.GetString(arr, 0, arr.Length);
                ms.Close();
            }
            Console.WriteLine(xmlString);

            Console.ReadKey();
        }
    }

    public class Person
    {
        //必须定义一个无参数构造函数,否则无法序列化(当然完全不写构造函数也是可以序列化的,因为有个默认的无参构造函数)
        public Person() { }

        public Person(int id, string name, int age)
        {
            Id = id;
            Name = name;
            //Age = age;
        }
        public int Id { get; set; }
        public string Name { get; set; }
        //私有字段
        private int Age { get; set; }
        //只读属性
        private int height;
        public int Height { get { return height; } }
    }
}
Copier après la connexion

La sortie du code est la suivante :

 

À partir du résultat ci-dessus, nous pouvons conclure qu'un constructeur sans paramètre doit être requis, et celui par défaut est également acceptable. Mais notez que lorsque le constructeur sans paramètre par défaut est écrasé, un constructeur sans paramètre doit être ajouté. De plus, les propriétés privées et les propriétés en lecture seule ne peuvent pas être sérialisées.

 Plus de Notes :

  1. Pour séquencer La classe doit avoir un constructeur par défaut avant de pouvoir être sérialisé à l'aide de XmlSerializer ; la méthode

  2. ne peut pas être sérialisée

  3. Indices, champs privés ou ; les propriétés en lecture seule (à l'exception des propriétés de collection en lecture seule) ne peuvent pas être sérialisées

  4. Les classes qui doivent être sérialisées doivent avoir un constructeur sans paramètre Fonction

  5. les variables d'énumération peuvent être sérialisées en chaînes. Il n'est pas nécessaire d'utiliser [XmlInclude]

  6. pour exporter des objets de type non basiques. Vous devez utiliser [ XmlInclude] déclaré à l'avance. Cette règle s'applique récursivement aux éléments enfants

  7. Si le paramètre IsNullable dans Attribute est égal à false, cela signifie que si l'élément est nul, l'élément ne sera pas affiché. (Valide pour les types valeur)

  8. Certaines classes ne peuvent pas être sérialisées XML (même si [XmlInclude] est utilisé)

  • IDictionary (tel que HashTable)

  • La situation dans laquelle un objet de classe parent attribue une valeur à un objet de sous-classe

  • Références circulaires entre objets

 9. Pour les objets qui ne peuvent pas être sérialisés XML, envisagez

  • d'utiliser la sérialisation XML personnalisée (implémentant IXmlSerialised

    interface)

  • Pour la classe qui implémente IDictionary, vous pouvez envisager (1) de la remplacer par d'autres classes de collection ; (2) de l'encapsuler avec une classe et de fournir les fonctions Add et this

  • Certains types doivent être convertis avant de pouvoir être sérialisés en XML. Par exemple, pour sérialiser XML System.Drawing.Color, vous pouvez d'abord utiliser ToArgb() pour le convertir en entier

  • S'il n'est pas pratique de sérialiser un objet avec XML, vous pouvez envisagez d'utiliser la sérialisation binaire.

 

Quand tu ne veux pas sérialiser :

  • Quand tu ne veux pas souhaitez sérialiser un attribut, utilisez la balise [System.Xml.Serialization.XmlIgnore], peut être utilisée pour les attributs ;

  • [NonSerializing] n'est pas valide lorsqu'il est appliqué aux attributs, peut être utilisé pour classes,

    structures, etc.

Le constructeur par défaut est nécessaire car la désérialisation utilise essentiellement la réflexion, et le constructeur par défaut est nécessaire pour instancier la classe si le constructeur par défaut. est supprimé, il n'y aura pas de problème de compilation, mais une erreur sera signalée lors de l'exécution.

 

Essayez de ne pas initialiser des propriétés relativement volumineuses dans le constructeur par défaut, ce qui entraînerait l'initialisation de la liste deux fois lors de la désérialisation : une fois dans le constructeur par défaut, puis lors de la désérialisation. Lire à partir du XML document et exécutez-le à nouveau.

2. Changer la valeur par défaut de la sérialisation XML

Habituellement, dans le processus de sérialisation XML, beaucoup de choses sont automatiquement générées, comme Espace de noms XML, encodage, etc.

 

1. Supprimez l'espace de noms et le préfixe par défaut :

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  ns.Add("", "");  
  //第一个参数是前缀,第二个参数是命名空间  
  //然后在序列化的时候,指定自定义命名空间  
  xml.Serialize(ms, p, ns);
Copier après la connexion
Comparaison de sortie :

Bien entendu, cette méthode peut également être utilisée pour générer l'espace de noms personnalisé que vous souhaitez.

 

2. Supprimez la déclaration XML : > Sortie :

public static string ObjectToXmlSerializer(Object Obj)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            //去除xml声明
            settings.OmitXmlDeclaration = true;
            settings.Encoding = Encoding.Default;
            System.IO.MemoryStream mem = new MemoryStream();
            using (XmlWriter writer = XmlWriter.Create(mem, settings))
            {
                //去除默认命名空间xmlns:xsd和xmlns:xsi
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                XmlSerializer formatter = new XmlSerializer(Obj.GetType());
                formatter.Serialize(writer, Obj, ns);
            }
            return Encoding.Default.GetString(mem.ToArray());
        }
Copier après la connexion

  3、换行缩进

  settings.Indent = true;
Copier après la connexion

  当XmlWriterSettings如此设置后,输出的XML为:

  

  4、指定缩进字符

  settings.IndentChars = "--";
Copier après la connexion

  输出如下:

  

  XmlWriterSettings更多设置属性如下:

成员说明
CloseOutput获取或设置一个值,该值指示在调用 Close 方法时,XmlWriter 是否还应该关闭基础流或 TextWriter。
Encoding获取或设置要使用的文本编码的类型。
Indent获取或设置一个值,该值指示是否缩进元素。
IndentChars获取或设置缩进时要使用的字符串。
NamespaceHandling获取或设置一个值,该值指示在编写 XML 内容时,XmlWriter 是否应移除重复的命名空间声明。 的默认是输出程序中出现的所有命名空间声明。
NewLineChars获取或设置要用于分行符的字符串
NewLineHandling获取或设置一个值,该值指示是否将输出中的分行符正常化。
NewLineOnAttributes获取或设置一个值,该值指示是否将属性写入新行。
OmitXmlDeclaration获取或设置一个值指示省略 XML 声明。
Encoding获取或设置要使用的文本编码的类型。
Reset方法重置以上属性

  http://msdn.microsoft.com/zh-cn/library/system.xml.xmlwritersettings(v=vs.110).aspx

三、实现序列化接口IXmlSerializable

  实现IXmlSerializable接口之后,我们能够自定义类序列化的方式。

  该接口包含3个方法:

XmlSchema GetSchema();
void ReadXml(XmlReader reader);
void WriteXml(XmlWriter writer);
Copier après la connexion

  简单示例:

namespace 自定义序列化
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Id = 1;
            p.Name = "刘备";

            string str = ObjectToXmlSerializer(p);
            Console.WriteLine(str);

            Person p1 = ObjectToXmlDESerializer<Person>(str);
            Console.WriteLine("我的名字是:" + p1.Name);

            Console.ReadKey();
        }

        //序列化Xml
        public static string ObjectToXmlSerializer(Object Obj)
        {
            string XmlString = "";
            XmlWriterSettings settings = new XmlWriterSettings();
            //去除xml声明
            //settings.OmitXmlDeclaration = true;
            settings.Indent = true;
            settings.Encoding = Encoding.Default;
            using (System.IO.MemoryStream mem = new MemoryStream())
            {
                using (XmlWriter writer = XmlWriter.Create(mem, settings))
                {
                    //去除默认命名空间xmlns:xsd和xmlns:xsi
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    XmlSerializer formatter = new XmlSerializer(Obj.GetType());
                    formatter.Serialize(writer, Obj, ns);
                }
                XmlString = Encoding.Default.GetString(mem.ToArray());
            }
            return XmlString;
        }

        //反序列化
        public static T ObjectToXmlDESerializer<T>(string str)where T : class
        {
            object obj;
            using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str)))
            {
                using (XmlReader reader = XmlReader.Create(mem))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(T));
                    obj = formatter.Deserialize(reader);
                }
            }
            return obj as T;
        }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class PersonSerializer : IXmlSerializable
    {
        private Person p;
        public int Id { get; set; }
        public string Name { get; set; }

        #region IXmlSerializable 成员

        System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
        {
            throw new NotImplementedException();
        }

        //如果这个方法默认则报:XML 文档(2, 2)中有错误。
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            reader.ReadElementString("Person");
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            writer.WriteElementString("Id", Id.ToString());
            writer.WriteElementString("Name", Name);
        }

        #endregion
    }
}
Copier après la connexion

  输出如下:

  

  我们都知道,接口是不支持序列化的。下面来做个有用的示例,实现IList的序列化与反序列化

namespace IList<T>的序列化与反序列化
{
    class Program
    {
        static void Main(string[] args)
        {
            Woman w1 = new Woman() { Id = 1, Name = "貂蝉" };
            Woman w2 = new Woman() { Id = 2, Name = "西施" };

            List<Woman> ListWoman = new List<Woman>();
            ListWoman.Add(w1);
            ListWoman.Add(w2);
            Person p = new Person();
            p.Id = 1;
            p.Name = "刘备";
            p.ListWoman = ListWoman;

            string str = ObjectToXmlSerializer(p);
            Console.WriteLine(str);

            Person p1 = ObjectToXmlDESerializer<Person>(str);
            Console.WriteLine("我的名字是:" + p1.Name + "我的老婆有:");
            foreach (Woman w in p1.ListWoman)
            {
                Console.WriteLine(w.Name);
            }

            Console.ReadKey();
        }

        //序列化Xml
        public static string ObjectToXmlSerializer(Object Obj)
        {
            string XmlString = "";
            XmlWriterSettings settings = new XmlWriterSettings();
            //去除xml声明
            //settings.OmitXmlDeclaration = true;
            settings.Indent = true;
            settings.Encoding = Encoding.Default;
            using (System.IO.MemoryStream mem = new MemoryStream())
            {
                using (XmlWriter writer = XmlWriter.Create(mem, settings))
                {
                    //去除默认命名空间xmlns:xsd和xmlns:xsi
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    XmlSerializer formatter = new XmlSerializer(Obj.GetType());
                    formatter.Serialize(writer, Obj, ns);
                }
                XmlString = Encoding.Default.GetString(mem.ToArray());
            }
            return XmlString;
        }

        //反序列化
        public static T ObjectToXmlDESerializer<T>(string str) where T : class
        {
            object obj;
            using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str)))
            {
                using (XmlReader reader = XmlReader.Create(mem))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(T));
                    obj = formatter.Deserialize(reader);
                }
            }
            return obj as T;
        }
    }

    public class Person : IXmlSerializable
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public IList<Woman> ListWoman { get; set; }

        #region IXmlSerializable 成员

        System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
        {
            throw new NotImplementedException();
        }

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
        //一定要特别注意配对问题,否则很容易反序列化集合出现只能够读取第一个的情况
            reader.ReadStartElement("Person");
            Id = Convert.ToInt32(reader.ReadElementString("Id"));
            Name = reader.ReadElementString("Name");
            //我也不知道为什么,复杂类型只能够另外定义一个,获得值之后再给原来的赋值
            List<Woman> ListWoman2 = new List<Woman>();
            reader.ReadStartElement("ListWoman");
        while (reader.IsStartElement("Woman"))
            {
                Woman w = new Woman();
                reader.ReadStartElement("Woman");
                w.Id = Convert.ToInt32(reader.ReadElementString("Id"));
                w.Name = reader.ReadElementString("Name");
                reader.ReadEndElement();
                reader.MoveToContent();
                ListWoman2.Add(w);
            }
            ListWoman = ListWoman2;
            reader.ReadEndElement();
            reader.ReadEndElement();
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
        //这里是不需要WriteStart/End Person的
            writer.WriteElementString("Id", Id.ToString());
            writer.WriteElementString("Name", Name);
            //有重载,想设置命名空间,只需在参数加上
            writer.WriteStartElement("ListWoman");
            foreach (Woman item in ListWoman)
            {
                PropertyInfo[] ProArr = item.GetType().GetProperties();
                writer.WriteStartElement("Woman");
                foreach (PropertyInfo p in ProArr)
                {
                    writer.WriteElementString(p.Name, p.GetValue(item, null).ToString());
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }

        #endregion
    }

    public class Woman
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
Copier après la connexion

  输出如下:

  

  以上代码是能够直接用于序列化数组的,也就是IList的,下面在贴上两个序列化与反序列化IList的方法:

//序列化Xml
        public static string ListToXmlSerializer<T>(IList<T> ListT)
        {
            XmlSerializer ser = new XmlSerializer(ListT.GetType());
            System.IO.MemoryStream mem = new MemoryStream();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.OmitXmlDeclaration = false;
            settings.Encoding = Encoding.UTF8;
            XmlWriter writer = XmlWriter.Create(mem, settings);
            ser.Serialize(writer, ListT);
            writer.Close();
            string strtmp = Encoding.UTF8.GetString(mem.ToArray());
            return strtmp;
        }

        //反序列化Xml
        public static List<T> XmlToListSerializer<T>(Stream stream)
        {
            string XmlPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"\OutLine\" + typeof(T).Name + ".xml";

            using (StreamReader sr = new StreamReader(stream, System.Text.Encoding.UTF8))
            {
                XmlSerializer ser = new XmlSerializer(typeof(List<T>));
                var listsch = ser.Deserialize(sr);
                List<T> reses = listsch as List<T>;
                return reses;
            }
        }
Copier après la connexion

  下面给出一个序列化与反序列化通过反射的复杂对象的示例:

using System.Linq.Expressions;namespace 控制台___学习测试
{
    class Program
    {
        static void Main(string[] args)
        {
            Woman w1 = new Woman() { Id = 1, Name = "貂蝉" };
            Woman w2 = new Woman() { Id = 2, Name = "西施" };
            List<Woman> ListWoman1 = new List<Woman>();
            ListWoman1.Add(w1);
            ListWoman1.Add(w2);

            List<Person> ListPerson = new List<Person>();
            Person p1 = new Person() { Id = 1, Name = "刘备", ListWoman = ListWoman1 };
            Person p2 = new Person() { Id = 2, Name = "关羽", ListWoman = ListWoman1 };
            Person p3 = new Person() { Id = 3, Name = "张飞", ListWoman = ListWoman1 };
            ListPerson.Add(p1);
            ListPerson.Add(p2);
            ListPerson.Add(p3);
            string xml = ListToXmlSerializer(ListPerson);
            Console.WriteLine(xml);

            MemoryStream mem = new MemoryStream(Encoding.UTF8.GetBytes(xml));
            List<Person> ListPerson2 = XmlToListSerializer<Person>(mem);

            Console.WriteLine(ListPerson2.Count);

            Console.WriteLine(ListPerson2[2].ListWoman[1].Name);
            Console.ReadKey();
        }

        //序列化Xml
        public static string ListToXmlSerializer<T>(IList<T> ListT)
        {
            XmlSerializer ser = new XmlSerializer(ListT.GetType());
            System.IO.MemoryStream mem = new MemoryStream();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;
            settings.Encoding = Encoding.UTF8;
            XmlWriter writer = XmlWriter.Create(mem, settings);
            ser.Serialize(writer, ListT);
            writer.Close();
            string strtmp = Encoding.UTF8.GetString(mem.ToArray());
            File.WriteAllText(@"D:\222.xml", strtmp);
            return strtmp;

        }

        //反序列化Xml
        public static List<T> XmlToListSerializer<T>(Stream stream)
        {
            using (StreamReader sr = new StreamReader(stream, System.Text.Encoding.UTF8))
            {
                XmlSerializer ser = new XmlSerializer(typeof(List<T>));
                var listsch = ser.Deserialize(sr);
                List<T> reses = listsch as List<T>;
                return reses;
            }
        }
    }

    public class Person : IXmlSerializable
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public IList<Woman> ListWoman { get; set; }

        #region IXmlSerializable 成员

        System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
        {
            throw new NotImplementedException();
        }

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            //while (reader.Name == "Person")
            //{
            reader.ReadStartElement("Person");
            Id = Convert.ToInt32(reader.ReadElementString("Id"));
            Name = reader.ReadElementString("Name");
            List<Woman> newWomans = new List<Woman>();
            PropertyInfo[] ProArr = typeof(Woman).GetProperties();
            reader.ReadStartElement("ListWoman");
            while (reader.IsStartElement("Woman"))
            {
                Woman Item2 = new Woman();
                reader.ReadStartElement("Woman");
                foreach (PropertyInfo p in ProArr)
                {
                    string str = reader.ReadElementString(p.Name);
                    p.SetValue(Item2, Convert.ChangeType(str, p.PropertyType), null);
                }
                reader.ReadEndElement();
                reader.MoveToContent();
                newWomans.Add(Item2);
            }
            ListWoman = newWomans;
            reader.ReadEndElement();
            reader.ReadEndElement();
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            writer.WriteElementString("Id", Id.ToString());
            writer.WriteElementString("Name", Name);
            writer.WriteStartElement("ListWoman");
            foreach (Woman item in ListWoman)
            {
                PropertyInfo[] ProArr = item.GetType().GetProperties();
                writer.WriteStartElement("Woman");
                foreach (PropertyInfo p in ProArr)
                {
                    if (p.GetValue(item, null) != null)
                    {
                        writer.WriteElementString(p.Name, p.GetValue(item, null).ToString());
                    }
                    else
                    {
                        writer.WriteElementString(p.Name, "");
                    }
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }

        #endregion
    }

    public class Woman
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
Copier après la connexion

  以上代码输出:

  

  特别提示,一定要特别特别注意,ReadStartElement与ReadEndElement的问题,否则很容易出现反序列化集合时只能够读取第一个的情况。而对于序列化,如果WriteStartElement与WriteEndElement不匹配,出现的只是XML标签对不匹配的问题,没Read的时候那么坑。

四、XML特性

  有时,我们在序列化时想要自定义XML的结构,这时候就要用到我们的属性类了。属性类提供了很多特性供我们使用,以完成自定义序列化功能。

名称描述
XmlAttribute表示一个特性对象的集合,这些对象控制XmlSerializer如何序列化和反序列化对象
XmlArrayAttribute指定XmlSerializer应将特定的类成员序列化为XML元素数组
XmlArrayItemAttribute指定XmlSerializer可以放置在序列化数组中的派生类型
XmlArrayItemAttributes表示XmlArrayItemAttribute对象的集合
XmlAttributeAttribute指定XmlSerializer应将类成员作为XML特性序列化
XmlChoiceIdentifierAttribute指定可以通过使用枚举来进一步消除成员的歧义
XmlElementAttribute在XmlSerializer序列化或反序列化包含对象时,指示公共字段或属性表示XML元素
XmlElementAttributes表示XmlElementAttribute的集合,XmlSerializer将其用于它重写序列化类的默认方式
XmlEnumAttribute控制XmlSerializer如何序列化枚举成员
XmlIgnoreAttribute指示XmlSerializer方法不序列化公共字段或公共读/写属性值
XmlIncludeAttribute允许XmlSerializer在它序列化或反序列化对象时识别类型
XmlRootAttribute控制视为XML根元素的属性目标的XML序列化
XmlTextAttribute当序列化或反序列化时,想XmlSerializer指示应将此成员作为XML文本处理
XmlTypeAttribute控制当属性目标由XmlSerializer序列化时生成的XML结构
XmlAnyAttributeAttribute指定成员(返回XmlAttribute对象的数组的字段)可以包含XML属性
XmlAnyElementAttribute指定成员可以包含对象,该对象表示在序列化或反序列化的对象中没有相应成员的所有XML元素
XmlAnyElementAttributes表示XmlAnyElementAttribute对象的集合
XmlAttributeEventArgs为UnKnowAttribute提供数据
XmlAttributeOverrides允许你在使用XmlSerializer序列化或反序列化时重写属性、字段和类特性
XmlElementEventArgs为UnknownElement事件提供数据
XmlNamespaceDeclarationsAttribute指定目标属性、参数、返回值或类成员包含与XML文档中所用命名空间关联的前缀
XmlNodeEventArgs为UnknownNode时间提供数据
XmlSerializer将对象序列化到XML文档中和从XML文档中反序列化对象,XmlSerializer使你得以控制如何将对象编码到XML中
XmlSerializerNamespaces包含XmlSerializer用于在XML文档实例中生成限定名的XML命名空间和前缀
XmlTypeMapping包含从一种类型到另一种类型的映射

  下面仅仅给出两个简单示例:

namespace 学习测试
{
    [Serializable]
    public class Person
    {
        public Person() { }

        public int Id { get; set; }
        public string Name { get; set; }
        [XmlAttribute(DataType = "string")]
        public string Content { get; set; }
        [XmlIgnore]
        public int Age { get; set; }
        [XmlArray]
        [XmlArrayItem("Int32", typeof(Int32))]
        public IList ListInt { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IList list = new ArrayList();
            list.Add(1);
            list.Add(2);
            list.Add(3);

            Person p = new Person();
            p.Id = 1;
            p.Name = "刘备";
            p.Age = 23;
            p.Content = "这是一个牛人";
            p.ListInt = list;
            string strXml = ObjectToXmlSerializer(p);
            Console.WriteLine(strXml);

            //反序列化IList还有问题
            //Person p2 = ObjectToXmlDESerializer<Person>(strXml);
            //Console.WriteLine(p2.Name);

            Console.ReadKey();
        }

        //序列化
        public static string ObjectToXmlSerializer(Object Obj)
        {
            string XmlString = "";
            XmlWriterSettings settings = new XmlWriterSettings();
            //去除xml声明
            //settings.OmitXmlDeclaration = true;
            settings.Indent = true;
            settings.Encoding = Encoding.Default;
            using (System.IO.MemoryStream mem = new MemoryStream())
            {
                using (XmlWriter writer = XmlWriter.Create(mem, settings))
                {
                    //去除默认命名空间xmlns:xsd和xmlns:xsi
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    XmlSerializer formatter = new XmlSerializer(Obj.GetType());
                    formatter.Serialize(writer, Obj, ns);
                }
                XmlString = Encoding.Default.GetString(mem.ToArray());
            }
            return XmlString;
        }

        //反序列化Xml
        public static T ObjectToXmlDESerializer<T>(string str) where T : class
        {
            object obj;
            using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str)))
            {
                using (XmlReader reader = XmlReader.Create(mem))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(T));
                    obj = formatter.Deserialize(reader);
                }
            }
            return obj as T;
        }
    }
}
Copier après la connexion

2013/12/27 常遇错误记录:

反序列化错误提示:

1、XML 文档(2, 2)中有错误:

  报这个错误一般是由于序列化与反序列化的类型不一致:

XmlSerialize.Serialize(@"C:\Person.xml",person);  
//person 是 Person类的对象var test = XmlSerialize.DeSerialize(typeof(Person), @"C:\Person.xml");
Copier après la connexion

2014/08/12

2、XmlIgnore与NonSerialized的区别。

  1、XmlIgnore能作用于属性,NonSerialized只作用于字段。

  2、XmlIgnore对序列化与反序列化均有效,而NonSerialized只影响序列化,反序列化不管。(非百分百确定)

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal