其實這個問題在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: SRZ070313000366Jimmy 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: SRZ070313000366Hi 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 |
|
|
|
|