`
mmdev
  • 浏览: 13244124 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

其实这个问题在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
分享到:
评论

相关推荐

    ASP.NET\ASP.NET 2.0编程珠玑--来自MVP 2.0编程珠玑--来自MVP的权威开发指南

    ASP.NET 2.0是微软推出的Web应用程序框架,它基于.NET Framework,用于构建动态网站、Web应用程序和Web服务。此框架极大地简化了Web开发过程,提供了丰富的控件库、数据绑定机制以及内置的安全性功能。《ASP.NET 2.0...

    C#2.0序列化和反序列化 程序集反射技术

    在.NET框架中,C# 2.0引入了一系列强大的特性,其中包括序列化和反序列化以及程序集的反射技术。这些技术是开发高效、灵活且可扩展的应用程序的基础,尤其在处理数据持久化、网络通信和组件交互时显得尤为重要。 **...

    spring2.0技术手册--林信良

    ### Spring 2.0 技术手册核心知识点详解 #### 一、Spring 2.0 概览 《Spring 2.0 技术手册》是继 Spring 1.0 之后的重要著作,作者林信良针对 Spring 框架在 2.0 版本中的新特性进行了深入剖析与讲解。本书不仅...

    hibernate4.2-jar包.zip

    《深入理解Hibernate 4.2:从jar包剖析框架核心》 Hibernate,作为Java领域中最受欢迎的对象关系映射(ORM)框架之一,极大地简化了数据库操作。本文将围绕"hibernate4.2-jar包.zip"进行深入探讨,解析其中的关键...

    C#写的Json与Xml互转支持.net framework2.0以上组件Newtonsoft.Json.dll

    Newtonsoft.Json是由James Newton-King开发的流行的JSON库,它提供了丰富的功能,包括序列化、反序列化以及JSON和XML之间的转换。首先,要使用这个库,你需要在项目中引用Newtonsoft.Json.dll。如果你的项目是.NET ...

    axml-2.0.jar

    axml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jaraxml-2.0.jar

    spring-framework-2.0-with-dependencies.zi

    3. **数据访问集成(Data Access Integration)**:Spring 2.0增强了对各种数据访问技术的支持,包括JDBC、ORM(Object-Relational Mapping)框架如Hibernate和JDO,以及对JPA(Java Persistence API)的初步支持。...

    xml-jar-2.0.jar

    xml-jar-2.0.jarxml-jar-

    net framework 2.0 sp1 的几个dll文件

    XML是一种广泛使用的结构化数据交换格式,System.Xml允许开发人员在应用程序中读写XML文件,进行数据序列化和反序列化。 在C#编程中,这些DLL文件是开发者经常打交道的库,通过引用这些库,开发者可以轻松地实现...

    spring-context-4.2.xsd.zip

    除了基础的配置,`spring-context-4.2.xsd`还支持对资源加载、国际化、消息源、任务调度、事件监听等高级特性。例如,`&lt;context:component-scan&gt;`元素可以自动扫描并注册带有特定注解的bean,极大地简化了代码配置。...

    struts-2.0.11.2-lib

    在这个"struts-2.0.11.2-lib"压缩包中,包含了Struts2.0.11.2版本所需的所有核心库文件,这些文件对于理解和使用Struts2框架至关重要。 1. **Struts2的核心组件**: - `struts2-core.jar`:这是Struts2框架的核心...

    Wince.NET2.0(文件)

    Windows CE .NET 2.0,简称WinCE.NET 2.0,是微软开发的一个嵌入式操作系统平台,主要用于小型设备如掌上电脑、车载信息系统、工业自动化设备等。这个"绿色版本"指的是一个免安装的版本,用户只需将文件复制到指定的...

    renren-fast开源框架开发文档2.0_完整版.zip

    《人人快开框架开发文档2.0:SpringBoot+Vue深度解析》 “人人快开”(Renren-Fast)是一款基于SpringBoot和Vue.js的开源框架,它为开发者提供了快速构建企业级Web应用的能力。这份《Renren-Fast开源框架开发文档...

    Hessian 2.0序列化协议规范.docx

    《Hessian 2.0序列化协议规范》 在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍...

    xmlschema-core-2.0.jar

    cxf jar xmlschema-core-2.0.jar

    struts-2.0.11.2-all

    这个压缩包"struts-2.0.11.2-all"很可能包含了Struts 2框架的完整源代码、库文件、文档以及示例项目,以便于开发者快速集成和学习。 在Struts 2框架中,有以下几个核心概念和功能: 1. **Model-View-Controller ...

    C# XML和类之间的转化,序列化

    在.NET框架中,C#语言提供了强大的XML处理能力,其中包括XML序列化和反序列化功能。这是一项重要的技术,能够帮助开发者将XML文档转换为对象(反序列化),或者将对象转换为XML文档(序列化)。这样的转换对于数据...

    ASP.NET 2.0 XML编程指南

    ASP.NET 2.0是微软开发的一个用于构建Web应用程序的框架,它极大地简化了Web开发过程,特别是对于处理XML数据时。XML(eXtensible Markup Language)是一种数据交换和存储的标准格式,广泛应用于分布式系统和跨平台...

    poi-2.0-final和poi-3.2-final

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。POI库为Java开发者提供了读写Microsoft Office文件的能力,使得在没有安装Office的情况下,也能进行相关操作。 ...

    Pro .NET 2.0 XML

    - **XML序列化**:通过使用System.Xml.Serialization命名空间中的工具,可以方便地将对象转换为XML格式,或者从XML文件中反序列化对象。这对于保存对象状态或在系统之间传输数据非常有用。 #### 4. 使用XML进行配置...

Global site tag (gtag.js) - Google Analytics