这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存。为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具类来实现。(需要设置属性为public)

弱弱的问一句,这种“序列化”的说法是对的吗?如果我说错了记得提醒我一下(⊙v⊙)

我发现我又二货了一把,序列话和反序列化前辈已经写得很好很详细了 Fish Li

实现类代码:

using System;
using System.Reflection;
using System.Xml.Linq;

namespace MyTool
{
    public static class ObjectToXml
    {
        public static string Path
        {
            get { return String.Format(@"{0}/{1}.xml", Environment.CurrentDirectory,DateTime.Now.Day.ToString()); }
        }
        public static void Intit(object ob)
        {
            XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("Data")); //建立跟节点 <Data></Data>

            Process(ob,doc.Element("Data"));

            doc.Save(Path);
        }

        private static void Process(object ob,XElement doc)
        {
            XElement data = doc;
            string ClassName = ob.GetType().Name;

            data.Add(new XElement(ClassName));//取类名 添加一个节点

            PropertyInfo[] properties = ob.GetType().GetProperties(BindingFlags.Instance |BindingFlags.Public);
            foreach (var item in properties)
            {
                string type = item.GetValue(ob).GetType().Name;

                if (type.ToLower() == "string" || type.ToLower() == "int32" || type.ToLower() == "double")//判断属性是否是基本类型比如strin int double 若是,则建立节点并赋值
                {
                    XElement ChildNode = data.Element(ClassName);
                    ChildNode.Add(new XElement(item.Name, item.GetValue(ob)));
                }
                else //否则,递归运行Process函数
                {
                    Process(item.GetValue(ob), data.Element(ClassName));
                }
            }

        }
    }
}
View Code

相关文章:

  • 2022-02-13
  • 2022-02-16
  • 2022-01-28
  • 2022-12-23
  • 2022-12-23
  • 2022-02-06
猜你喜欢
  • 2021-12-31
  • 2022-12-23
  • 2022-01-26
  • 2022-12-23
  • 2021-05-30
  • 2021-12-05
相关资源
相似解决方案