其实这个问题在2007/3/13就提交到了微软技术支持,但直到今天,对这个问题还没有一个完美的结果(他们最好的建议就是,自己解析XML文件),只好请求微软的技术支持把这个问题close掉。
问题的关键在于:1、目前精简框架集不支持二进制序列化
2、同时XML序列化不支持定制
3、反序列化代码封装太厉害,不可配置,并且没有进度反馈信息
4、反序列化时太耗CPU时间,无法在其它线程显示进度动画
我把交流的过程写到下面,给遇到同类问题的朋友做个参考。
----------------------------------------------------------------------------------------------------
下面是关于这个问题的总结:
================================================================
Q:有没有办法加速XmlSerializer反序列化的过程?
A:XmlSerializer反序列化的过程与反序列化的类的复杂程度有关,也与相关硬件平台的处理能力有关。在嵌入式平台
上,一般来说硬件的处理能力有限,所以反序列化的过程会比在桌面上的应用程序慢不少。所以目前来看,这样的行为是
在意料之中的。另外,在.NET Compact Framework下并没有诸如二进制序列化,或者定制序列化的方法。如果一定
要加速该过程的话,那么可以通过XmlTextReader这个类来手工的分析xml文件然后反射出对象。
================================================================
|
讨论 |
|
|
发送回复 |
|
微软的回复 - 2007/8/7 16:45:12
|
微软的回复 - 2007/7/27 19:03:14 From: Jimmy Zhu Sent: Friday, July 27, 2007 7:01 PM To: '叶帆' Cc: Rafe Wu Subject: RE: SRZ070313000366
叶先生,您好:
今天我打了几次你公司的电话,不过你公司的总机好像一直是忙音,所以没有办法能够联系上您。
对于XMLSerializer所引起的性能问题,经过一段时间的研究,我们得出了一些有用的信息。
首先,也是最重要的问题,我们需要确定引起该性能问题的根本原因是由于xml文件很大,以致于过多的IO动作引起的长时间等待还是由于XmlSerializer在解析xml文档时耗费了过多的时间。因为在嵌入式平台下,不论是处理器的能力,还是内存的大小都很有限,所以您可以发现即使是用文件浏览器打开windows目录,也需要花费很长的一段时间。而在桌面PC上浏览该文件夹,几乎瞬间就能完成了。所以如果确实是因为硬件的原因或是驱动程序所引起的问题,那么目前来看最好的解决方案就是在反序列化的工作放在一个单独的线程中,然后在主线程中将应用程序的图标改成繁忙状态。
如果是因为XmlSerializer在解析xml文档时耗费了过多的时间,我们建议您采用如下的方法来进行一些优化: 1. 将元素与属性的名字保持的尽可能的短 2. 尽可能的使用System.Xml.XmlNodeReader.Skip
另外,您反串行化的速度也和您串行化时对象的内部结构有关,可以根据您对象当中含有一个很大的数组的话,也还是可以有办法加快反序列化的过程的。 你可以通过使用XmlTextReader来手工反序列这个对象,如果对象里的结构很复杂的话,那这个方法就不太容易实现了。
在下一步的工作中,您可否提供您序列化生成的xml文件以及必要的类型定义,以供我们这边做些测试,找出这个问题的根本原因? 于此同时,我也把和我一起进行研究的同事Rafe Wu加到这个邮件中来。我们会一起对这个问题进行下一步的研究。谢谢您的合作!
Best regards, Jimmy Zhu
Developer Support Group Global Technical Support Center, Greater China Region (GCR GTSC) <mailto:jimmyzh@microsoft.com>
Delighting our customers is our #1 priority. We welcome your comments and suggestions about how we can improve the support we provide to you. Please feel free to email our Managers at <mailto:gtecfb@microsoft.com>. You can also contact my manager Li-Ming Fan at (86-21) 6469-1188 ext. 6330 or by sending email mailto:lmfan@microsoft.com <mailto:wenyu@microsoft.com>. |
微软的回复 - 2007/7/5 11:55:08 From: 叶帆 [mailto:yefan@vip.sina.com] Sent: Thursday, July 05, 2007 11:35 AM To: Jimmy Zhu Subject: Re: RE: SRZ070313000366
Jimmy Zhu,您好!
好的,谢谢! |
微软的回复 - 2007/7/5 11:54:32 From: Jimmy Zhu Sent: Thursday, July 05, 2007 11:29 AM To: '叶帆' Subject: RE: SRZ070313000366
叶先生,您好:
非常抱歉之前给您带来的不便。
我很高兴能够继续和您一起来解决这个问题。根据刚才的电话,我了解到目前您所处的情况是需要在上位机和下位机之间传输一些配置信息。具体操作是上位机对20多个类的配置信息进行序列化,然后下位机对这些类进行反序列化。在实际操作过程中,上位机能够及时进行序列化工作,但是下位机由于硬件处理能力有限,因而没有能力及时完成反序列化工作。所以我们会通过以下几个方面来看看是否有办法来提高整个反序列化的效率。 1. .Net CF 2.0中是否能够针对序列化和反序列化的内容进行定制?如果有可能进行定制的话,我们就可以针对部分属性进行序列化和反序列化操作。 2. 在反序列化处理过程中,是否有一些预处理的办法可以提高发序列化的效率? 3. 是否可以通过一些方法在整个反序列化过程中提示用户?
由于这些内容可能牵涉到.Net CF的具体实现细节,整个研究的过程可能会需要一些时间。在这个过程中,我会定期给您一些进展情况的报告。如果您有任何问题或者信息需要提供的话,也可以随时和我联系。希望通过我们共同的努力一起来解决这个问题。谢谢。
Best regards, Jimmy Zhu
Developer Support Group Global Technical Support Center, Greater China Region (GCR GTSC) <mailto:jimmyzh@microsoft.com>
Delighting our customers is our #1 priority. We welcome your comments and suggestions about how we can improve the support we provide to you. Please feel free to email our Managers at <mailto:gtecfb@microsoft.com>. You can also contact my manager Li-Ming Fan at (86-21) 6469-1188 ext. 6330 or by sending email mailto:lmfan@microsoft.com <mailto:wenyu@microsoft.com>. |
您的回复 - 2007/4/5 17:05:28 问题描述: “希望用代码控制自定义类需要序列化的字段”,这个问题优先吧。
确切的说应该是在精简框架集下(.net 2.0),如何用代码控制 类的公共字段 的XML序列化及反序列化。
非关键字方式(如关键子 XmlIgnore),应该用函数之类进行控制
此外,我觉得“WinCE平台下,文本显示和Windows平台不一致”也是一个Bug,因为同是精简框架下运行,同一种字体,我希望这个也能解决。
------------------------------------------- 难道非得把问题贴到这里你们才相应吗?邮件老早就发了!!!!!!!!!! 我的另一个问题,那个刘先生就响应的非常好。 |
微软的回复 - 2007/3/23 16:16:17 From: Jimmy Zhu Sent: Friday, March 23, 2007 4:15 PM To: '叶帆' Subject: RE: SRZ070313000366
叶帆,您好:
非常抱歉,我这个星期有任务在外,所以才刚刚看到您的邮件。
根据您在邮件中说的,我大概可以总结出下面几点问题: 1. 希望能够提供一个事件,反馈反序列化进度。 2. 希望用代码控制自定义类需要序列化的字段。 3. 希望提供反序列化加速的手段或技巧。 4. 反映一个问题,某些XML文件在WinCE设备上反序列化会失败。 5. WinCE平台下,文本显示和Windows平台不一致。
由于这些问题每一个都是一个独立的问题,而且每个都是需要通过一定的调查和研究才能够得出结论,所以跟据规定我们需要对每一个问题开一个case来追踪问题的状态和结果以便归档和记录。需要特别指出的是针对第三个问题属于performance调整的范围,所以需要立案作为advisory的case来讨论。当然,如果针对某个问题产品组确认为bug,微软不会在这个case上向您收费,这点请您放心。针对您提出的这一系列问题,不知道在目前的这个case中,您比较希望我们先解决哪一个?
谢谢。
Best regards, Jimmy Zhu Developer Support Group Global Technical Support Center, Greater China Region (GCR GTSC) <mailto:jimmyzh@microsoft.com>
Delighting our customers is our #1 priority. We welcome your comments and suggestions about how we can improve the support we provide to you. Please feel free to email our Managers at <mailto:gtecfb@microsoft.com>. You can also contact my manager Wen Yu at (86-21) 6469-1188 ext. 6303 or by sending email <mailto:wenyu@microsoft.com>. |
您的回复 - 2007/3/21 8:52:30 问题描述: VS2005开发问题说明 1、 XML反序列化问题 (1)、反序列化慢的问题 反序列化的代码如下: public static EmbedProject XMLDeserialize(string XmlFile, Type[] type) { try { //已知类型 const int MetaTypeNum = 28; Type[] mtype = new Type[MetaTypeNum + type.Length]; mtype[0] = typeof(EmbedForm); mtype[1] = typeof(MetaLine); mtype[2] = typeof(MetaCircle); mtype[3] = typeof(MetaEllipse); mtype[4] = typeof(MetaChord); mtype[5] = typeof(MetaRectangle); mtype[6] = typeof(MetaRoundRectangle); mtype[7] = typeof(MetaPoly); mtype[8] = typeof(MetaBitmap); mtype[9] = typeof(MetaButton); mtype[10] = typeof(MetaLabel); mtype[11] = typeof(MetaText); mtype[12] = typeof(MetaSymbol); //扩展图元 mtype[13] = typeof(Meta3DPipe); mtype[14] = typeof(MetaRealtimeCurve); mtype[15] = typeof(MetaHistoryCurve); mtype[16] = typeof(MetaDataForm); mtype[17] = typeof(MetaReportforms); mtype[18] = typeof(MetaPilotLamp); mtype[19] = typeof(MetaSwitch); mtype[20] = typeof(MetaInstrument); mtype[21] = typeof(MetaValve); mtype[22] = typeof(MetaKettle); mtype[23] = typeof(MetaPump); mtype[24] = typeof(MetaMotor); mtype[25] = typeof(MetaConveyerBelt); mtype[26] = typeof(MetaFlow); mtype[27] = typeof(MetaSign);
//-------------
for (int i = mtype.Length; i < mtype.Length + type.Length; i++) { mtype[i] = type[i - mtype.Length]; }
EmbedProject XmlData = new EmbedProject(); Stream sf = new FileStream(XmlFile, FileMode.Open, FileAccess.Read, FileShare.None); XmlSerializer xmls = new XmlSerializer(typeof(EmbedProject), mtype); XmlData = (EmbedProject)xmls.Deserialize(sf); sf.Close(); return XmlData; } catch(Exception e) { MessageBox.Show("反序列化失败:"+XmlFile +"<"+ e.Message+">","EasyHMI"); return null; } } 我是利用public List<EmbedForm> mForm = new List<EmbedForm>();语句,把多个类一起序列化到同一个xml文件中去(项目要求保存到一个文件,不允许多个xml文件),然后利用上面的代码反序列化。 问题是:在上位机大约1~3秒(视文件大小)就可以反序列化完毕,然而在WinCE平台(Arm9 200M主频)同样文件需要20~30秒才能反序列化完毕,并且反序列化期间CPU独占,其它线程基本处在堵塞状态。 希望的解决方案如下: 1、 能不能提供一个事件,反馈反序列化进度; 2、 XML序列化能不能自定义,我希望用代码控制我的每个类需要序列化的字段; 3、 提供反序列化加速的手段或技巧; 此外是Bug反馈,同样的xml文件(约11mb,不仅仅是因为大小,在继续添加某些类的序列化内容时,又可以成功)在上位机反序列化成功,在下位机反序列化失败(提示x行y列,有问题)。 2、 在WinCE平台上.net 精简框架集2.0下,文本显示和Windows平台不一致,如下图:
图片链接:http://p.blog.csdn.net/images/p_blog_csdn_net/yefanqiu/23649/o_%e6%96%87%e5%ad%97%e6%95%85%e9%9a%9c.jpg 实现的代码如下: StringFormat sFormat = new StringFormat(); sFormat.Alignment = Alignment; sFormat.LineAlignment = StringAlignment.Center; e.DrawString(Text, font, new SolidBrush(ForeColor), Rect, sFormat); |
微软的回复 - 2007/3/14 14:36:15 From: Jimmy Zhu Sent: Wednesday, March 14, 2007 2:35 PM To: 'yefan@vip.sina.com' Subject: SRZ070313000366
Hi Mr. Liu,
Thank you for contacting Microsoft GTSC. My name is Jimmy. I will be working with you on the service request SRZ070313000366.
According to the problem description in case log, there are two questions for .NET CF development on Windows CE platform. (1) Question about XML deserialize issue. (2) Font display issue on WinCE device. Please correct me if I misunderstood. As we are limited to handle one issue in one case, could you please separate one question to another case and let me know which one shall we focus in this case? I will go ahead and do some research based on your response. Please don’t hesitate to let me know if there is any concerns or comments.
Thank you.
Best regards, Jimmy Zhu Developer Support Group Global Technical Support Center, Greater China Region (GCR GTSC) <mailto:jimmyzh@microsoft.com>
Delighting our customers is our #1 priority. We welcome your comments and suggestions about how we can improve the support we provide to you. Please feel free to email our Managers at <mailto:gtecfb@microsoft.com>. You can also contact my manager Wen Yu at (86-21) 6469-1188 ext. 6303 or by sending email <mailto:wenyu@microsoft.com>. |
您的支持请求 - 2007/3/13 16:20:38 问题描述: 平台:上位机 Window XP SP2 VS2005 下位机:WinCE 4.2 精简框架集 2.0 sp1 1、XML反序列化问题(xml文件为序列化自动生成) 当WinCE系统时间为默认值(如18XX年)反序列化失败,提示XML文件有误。 一个大约11M左右的XML文件,在下位机提示反序列化失败,该行为一个图片的信息,继续在文档别处添加一些XML数据,即可正常运行。同样程序在上位机一切正常。 此外,能否提供反序列化的进度控制,因为在下位机反序列化时特别慢,并且CPU资源耗费很大,不能显示进度。 2、字体换行控制,在上位机显示正常,在下位机不换行显示。 相关代码: StringFormat sFormat = new StringFormat(); sFormat.Alignment = Alignment; sFormat.LineAlignment = StringAlignment.Center; e.DrawString(Text, font, new SolidBrush(ForeColor), Rect, sFormat); 操作系统: WindowsXP |
|
|
|
|
分享到:
相关推荐
通过反序列化,解析Xml文件。非常简单的例子,自己留用
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。 官网下载很慢的,...
.NET xml的序列化及反序列化 c#语言
C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化
可以将已知结构的XMl文件生成C#结构体代码,并将该结构体与xml文件进行互相转换
该Demo采用XmlSerializer对XML进行封装,序列化与反序列化以及读取指定节点的值
axml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jar
序列化和反序列化思路是通过一个类来映射XML,XML里面的元素,都被映射到类的成员变量。 业务处理不直接面对XML,而是面对类进行操作。反序列化是指把XML解析出来的类,序列化是指把类转换成XML字符串。所以我们的...
XML的序列化和反序列化 - - 博客频道
这是类编译后的dll动态链接库,其中含有对xml文件的序列化与反序列化操作,利用其可以实现对xml文件几乎全部的复杂操作。
.NET 实体序列化、反序列化XML与Binary,可实现实体序列化为XML,XML反序列化为实体,实体序列化为Binary,Binary序列化为实体
XML序列化与反序列化整理文档(12套) (附xml转化为序列化代码工具XML 2 Class) (附XML序列化的实例原代码)
XML序列化/反序列化类,放到项目中直接使用,很方便。 SerializationHelper
struts-2.0.dtdstruts.xmlstruts-2.0.dtd
此例子先用VS生成基于PLCOpen的XSD生成对应的类,然后利用序列化和反序列化的方式写入读取XML文件
实现C#序列化和反序列化XML-读取wordXML内容
本例子以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法。分享给大家供大家参考。 播客说明:http://www.cnblogs.com/bq-blog/p/xmloper2016.html
xml-jar-2.0.jarxml-jar-
C#Xml序列化与反序列化,适用于与第三方系统做接口,入参和出参为XML,XML自动转实体,实体自动转Xml