- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml;
- using System.Xml.Serialization;
- namespace ConsoleApp6
- {
- class Program
- {
- static void Main(string[] args)
- {
- string r = string.Empty;
- List<Base> list = new List<Base>() {
- new A() { Name = "initName",AName = "aa" },new B() { Name = "initName",BName = "bb" }
- };
- try
- {
- r = XmlHelper.SerializeToXml(list);
- }
- catch (Exception ex)
- {
- /* 生成 XML 文档时出错。 */
- Console.WriteLine(ex.Message);
- /* 不应是类型 ConsoleApp6.A。使用 XmlInclude 或 SoapInclude 特性静态指定非已知的类型。 */
- Console.WriteLine(ex.InnerException.Message);
- }
- Console.WriteLine(r);
- Console.Read();
- }
- }
- #region [ Test Class ]
- //处理方法:在基类上加上所有需要序列化的子类的 XmlInclude 特性就可以了。
- //下面的代码去掉注释,即可正常运行
- /*
- [XmlInclude(typeof(A))]
- [XmlInclude(typeof(B))]
- */
- public class Base
- {
- public string Name { get; set; }
- }
- public class A : Base
- {
- public string AName { get; set; }
- }
- public class B : Base
- {
- public string BName { get; set; }
- }
- #endregion
- #region [ XMLHelper ]
- public static class XmlHelper
- {
- public static void ObjectWriteToXmlFile<T>(T myObject,string filePath)
- {
- string xmlString = SerializeToXml<T>(myObject);
- File.WriteAllText(filePath,xmlString);
- }
- public static T XmlFileToObject<T>(string filePath)
- {
- string xmlString = File.ReadAllText(filePath);
- return DeserializeToObject<T>(xmlString);
- }
- /// <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;
- }
- }
- #endregion
- }