zoukankan      html  css  js  c++  java
  • C#实体类序列化为XML

      这两天,应要求做一个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

    使用:

    using System;
    using MyTool;
    
    namespace xmltest
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                var a = new student
                {
                    Name = "memeda", age = 10,gg=1.5,
                    more=new info
                    {
                        boy="nan",
                        moreinfo=new moreinfo
                        {
                            mv="mv"
                        }
                    }
                };
                ObjectToXml.Intit(a);
    
                Console.ReadKey();
            }
        }
    
        public class student
        {
            public string Name { get; set; }
            public int age { get; set; }
    
            public double gg { get; set; }
    
            public info more { get; set; }
        }
    
        public class info
        {
            public moreinfo moreinfo { get; set; }
            public string boy { get; set; }
        }
    
        public class moreinfo
        {
            public string mv { get; set; }
        }
    }

    最后的效果:

  • 相关阅读:
    HttpCookie类
    WebClient类
    最大流算法 ISAP 模板 和 Dinic模板
    拓扑序+dp Codeforces Round #374 (Div. 2) C
    二分 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D
    线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C
    无源无汇有上下界的最大流
    并查集+bfs+暴力滑窗 Codeforces Round #356 (Div. 2) E
    dfs Codeforces Round #356 (Div. 2) D
    cookie+session
  • 原文地址:https://www.cnblogs.com/001say/p/4389886.html
Copyright © 2011-2022 走看看