现在的位置: 首页 > 综合 > 正文

如何加速XML反序列化(精简框架集2.0SP1,WinCE4.2) — 寻求微软技术支持记

2012年12月08日 ⁄ 综合 ⁄ 共 9034字 ⁄ 字号 评论关闭

        其实这个问题在2007/3/13 就提交到了微软技术支持,但直到今天,对这个问题还没有一个完美的结果(他们最好的建议就是,自己解析XML文件),只好请求微软的技术支持把这个问题close掉。

        问题的关键在于:1、目前精简框架集不支持二进制序列化

                                        2、同时XML序列化不支持定制

                                        3、反序列化代码封装太厉害,不可配置,并且没有进度反馈信息

                                        4、反序列化时太耗CPU时间,无法在其它线程显示进度动画

        我把交流的过程写到下面,给遇到同类问题的朋友做个参考。

        ----------------------------------------------------------------------------------------------------

下面是关于这个问题的总结:
================================================================
Q:有没有办法加速XmlSerializer反序列化的过程?
A:XmlSerializer反序列化的过程与反序列化的类的复杂程度有关,也与相关硬件平台的处理能力有关。在嵌入式平台
上,一般来说硬件的处理能力有限,所以反序列化的过程会比在桌面上的应用程序慢不少。所以目前来看,这样的行为是
在意料之中的。另外,在.NET Compact Framework下并没有诸如二进制序列化,或者定制序列化的方法。如果一定
要加速该过程的话,那么可以通过XmlTextReader这个类来手工的分析xml文件然后反射出对象。
================================================================

     

 
问题标题:   平台:上位机 Window XP SP2 VS2005 下位机:WinCE 4.2 精简框架集 2.0 sp1 1、XML反序列化问题(xml文件为序列化...
产品:   Microsoft Visual Studio 2005 Professional
发送于:   2007/3/13 16:20:38
最后更新时间:   2007/8/7 16:45:08
 
描述:   问题描述: 平台:上位机 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
 
讨论
原有问题: Microsoft Visual Studio 2005 Professional  
微软的回复 - 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

抱歉!评论已关闭.