天天看點

如何加速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)

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 . You can also contact my manager Li-Ming Fan at (86-21) 6469-1188 ext. 6330 or by sending email mailto:[email protected] .

微軟的回複 - 2007/7/5 11:55:08

From: 葉帆 [mailto:[email protected]]

Sent: Thursday, July 05, 2007 11:35 AM

To: Jimmy Zhu

Subject: Re: RE: SRZ070313000366

Jimmy Zhu,您好!

  好的,謝謝!

微軟的回複 - 2007/7/5 11:54:32

Sent: Thursday, July 05, 2007 11:29 AM

非常抱歉之前給您帶來的不便。

我很高興能夠繼續和您一起來解決這個問題。根據剛才的電話,我了解到目前您所處的情況是需要在上位機和下位機之間傳輸一些配置資訊。具體操作是上位機對20多個類的配置資訊進行序列化,然後下位機對這些類進行反序列化。在實際操作過程中,上位機能夠及時進行序列化工作,但是下位機由于硬體處理能力有限,因而沒有能力及時完成反序列化工作。是以我們會通過以下幾個方面來看看是否有辦法來提高整個反序列化的效率。

  1. .Net CF 2.0中是否能夠針對序列化和反序列化的内容進行定制?如果有可能進行定制的話,我們就可以針對部分屬性進行序列化和反序列化操作。
  2. 在反序列化處理過程中,是否有一些預處理的辦法可以提高發序列化的效率?
  3. 是否可以通過一些方法在整個反序列化過程中提示使用者?

由于這些内容可能牽涉到.Net CF的具體實作細節,整個研究的過程可能會需要一些時間。在這個過程中,我會定期給您一些進展情況的報告。如果您有任何問題或者資訊需要提供的話,也可以随時和我聯系。希望通過我們共同的努力一起來解決這個問題。謝謝。

您的回複 - 2007/4/5 17:05:28

問題描述: “希望用代碼控制自定義類需要序列化的字段”,這個問題優先吧。

确切的說應該是在精簡架構集下(.net 2.0),如何用代碼控制 類的公共字段 的XML序列化及反序列化。

非關鍵字方式(如關鍵子 XmlIgnore),應該用函數之類進行控制

此外,我覺得“WinCE平台下,文本顯示和Windows平台不一緻”也是一個Bug,因為同是精簡架構下運作,同一種字型,我希望這個也能解決。

難道非得把問題貼到這裡你們才相應嗎?郵件老早就發了!!!!!!!!!! 我的另一個問題,那個劉先生就響應的非常好。

微軟的回複 - 2007/3/23 16:16:17

Sent: Friday, March 23, 2007 4:15 PM

葉帆,您好:

非常抱歉,我這個星期有任務在外,是以才剛剛看到您的郵件。

根據您在郵件中說的,我大概可以總結出下面幾點問題:

  1. 希望能夠提供一個事件,回報反序列化進度。
  2. 希望用代碼控制自定義類需要序列化的字段。
  3. 希望提供反序列化加速的手段或技巧。
  4. 反映一個問題,某些XML檔案在WinCE裝置上反序列化會失敗。
  5. WinCE平台下,文本顯示和Windows平台不一緻。

由于這些問題每一個都是一個獨立的問題,而且每個都是需要通過一定的調查和研究才能夠得出結論,是以跟據規定我們需要對每一個問題開一個case來追蹤問題的狀态和結果以便歸檔和記錄。需要特别指出的是針對第三個問題屬于performance調整的範圍,是以需要立案作為advisory的case來讨論。當然,如果針對某個問題産品組确認為bug,微軟不會在這個case上向您收費,這點請您放心。針對您提出的這一系列問題,不知道在目前的這個case中,您比較希望我們先解決哪一個?

謝謝。

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 . You can also contact my manager Wen Yu at (86-21) 6469-1188 ext. 6303 or by sending email .

您的回複 - 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 mForm = new List();語句,把多個類一起序列化到同一個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平台不一緻,如下圖:

圖檔連結:

https://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

實作的代碼如下:

微軟的回複 - 2007/3/14 14:36:15

Sent: Wednesday, March 14, 2007 2:35 PM

To: '[email protected]'

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.

您的支援請求 - 2007/3/13 16:20:38

問題描述: 平台:上位機 Window XP SP2 VS2005