首页 新闻 会员 周边 捐助

XML转换成实体类效率问题

0
悬赏园豆:5 [已解决问题] 解决于 2010-11-11 11:03

这是转实体类的方法

public static T XmlToObjList<T>(string xml)
        {
            Type type = typeof(T);
            object obj = Activator.CreateInstance(type, null);

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            System.Reflection.PropertyInfo[] paraList = type.GetProperties();
            object value = null;
            foreach (XmlAttribute att in doc.DocumentElement.Attributes)
            {
                if (type.GetProperty(att.Name) != null)
                {
                    value = GetPropertyValue(att.Value, type.GetProperty(att.Name).PropertyType);
                    type.InvokeMember(att.Name, System.Reflection.BindingFlags.SetProperty, null, obj, new object[] { value });
                }

            }
            return (T)obj;
        }

我把转换过来的实体类添加到泛型集合里面

List<Device> devicelist = new List<Device>();
            if (result == 0)
            {
                Device dc = new Device();
                XmlDocument xml = new XmlDocument();
                xml.LoadXml(strbody);
                //XmlNodeList xl = xml.SelectNodes("//device");等价下面
                XmlNodeList xl = xml.GetElementsByTagName("device");
                for (int i = 0; i < xl.Count; i++)
                {
                    XmlNode xn = xl[i];
                    dc = XMLBase.XmlToObjList<Device>(xn.OuterXml);                   
                    devicelist.Add(dc);
                                       
                }
            }
            return devicelist;

我用1000条数据测试,转换过程感觉很慢,请高手指点指点。

hbgdluck的主页 hbgdluck | 初学一级 | 园豆:148
提问于:2010-11-09 08:43
< >
分享
最佳答案
0

全用的反射,效率肯定会比较低

建议你考虑一下 .net 自带的xml反序列化这条路

参考:http://www.cnblogs.com/zyk/archive/2004/12/03/72393.html

收获园豆:5
LanceZhang | 小虾三级 |园豆:857 | 2010-11-09 09:57
谢谢了
hbgdluck | 园豆:148 (初学一级) | 2010-11-11 11:03
其他回答(2)
0

.net自带的xml序列化与反序列化性能也不咋地。

使用反射性能不太好。

 

你可以考虑把你的实体变成值键对的形式

如 原本为:

class Student

{

    public int Age{get;set;}

}

换成:

class Student

{

     Dictionary<string, object> datas = new Dictionary<string,object>();

     public int Age{get{return (int)datas["Age"];} set{datas["Age"] = value;}}

}

这样就不用对属性赋值了,直接对datas赋值即可

性能应该是不错的

小彬 | 园豆:947 (小虾三级) | 2010-11-09 11:23
0

序列化   至于XML序列化还是JSON还是二进制   看需求及接口而定

LoujaDy | 园豆:908 (小虾三级) | 2010-11-09 12:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册