Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]

Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]

?

Written by Allen Lee

?

1. Why Sgen.exe?

在《Serialize Your Deck with Positron [XML Serialization, XSD, C#]》一文中,我們領略到 XML Serialization 是如何簡化我們的 XML 處理工作。然而,XmlSerializer 在每次運行應用程序時,都會為待處理的類型生成用于序列化的代碼和程序集(assembly),這就導致了一個性能問題。

.NET 2.0 引入了 Sgen.exe 這個小工具,你可以用它為你的類預先生成那些用于序列化的程序集,讓這些程序集隨你的類一同發布,并使用這些程序集里面的 Serializer(s) 來對你的類執行序列化操作。

注意:本文將使用《Serialize Your Deck with Positron [XML Serialization, XSD, C#]》中的 Cards.cs 作為原始材料。

?

2. How to ...

2.1 ... Create a Serializer for Cards?

Step #01:把 Cards.cs 編譯為 Positron.Core.dll。

Step #02:啟動 SDK Command Prompt,去到 Positron.Core.dll 所在的目錄并輸入

sgen Positron.Core.dll

然后按下 [Enter],Sgen.exe 會在當前的目錄中生成一個 Positron.Core.XmlSerializers.dll 文件,它就是我們將用來提速的武器了。

至此,用于 Cards 的序列化的程序集已經制作完畢了。如果你想查看 Sgen.exe 究竟生成了什么代碼,一個眾所周知的方法就是使用 Reflector。但這里有一個更加簡單直接的方法,就是使用 Sgen.exe 所提供的 /k 或者 /keep 參數,該參數通知 Sgen.exe 把所生成的 C# 代碼保留在當前目錄中。

2.2 ... Use the Serializer in Cards?

Step #01:在 Visual C# 2005 Express Edition Beta 的 Solution Explorer 中添加對 Positron.Core.XmlSerializers.dll 的引用。

Step #02:在 Cards.cs 上添加如下語句:

None.gifusing?Microsoft.Xml.Serialization.GeneratedAssembly;

Step #03:修改 Cards.Load 和 Cards.Save 的實現,我們需要做的僅僅是把原來的

None.gifXmlSerializer?serializer?=?new?XmlSerializer(typeof(Cards));

換成

None.gifXmlSerializer?serializer?=?new?CardsSerializer();

至此,我們已經完成了對 Cards.cs 的改造了。

?

3. What's More...

如果你查看 Sgen.exe 所生成的代碼,無論你通過何種方式,你將發現里面有一系列以類名作為前綴的 Serializer,隨便哪個都可以單獨使用,但在 Positron 中,單獨使用別的 Serializer 是沒意義,因為我們不單獨序列化某個子元素或者屬性。

除此之外,里面的 XmlSerializerContract 也是一個有趣的類。默認情況下,Sgen.exe 會試圖為你所指定的輸入程序集中的每一個類生成一個 Serializer,但事實上并不是所有的類都能生成 Serializer,那么你如何得知 Sgen.exe 是否為輸入程序集中的某個類生成了一個 Serializer 呢?答案就在 XmlSerializerContract.CanSerialize 方法中,把你想測試的類型作為參數傳遞給該方法,如果 Sgen.exe 所生成的程序集包含該類型的 Serializer,該方法就返回 true,否則返回 false。另外,如果 Sgen.exe 所生成的程序集中包含較多的 Serializer,并且每個 Serializer 單獨使用都有意義,那么 XmlSerializerContract 可以作為一個工廠使用,把你希望序列化的類型作為參數傳遞給 XmlSerializerContract.GetSerializer,它將返回該類型的 Serializer,當然,前提是有這樣一個 Serializer。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java線程并發常用工具類使用

這次整理了一些比較常用的線程工具類啦。 CountDownLatch:在一組線程執行完后,才能開始執行調用等待的線程。上片文章提到過junit的測試盡量不要測試線程,如果硬是要可以使用CountDownLatch進行測試 CyclicBarrier:在一組線程中…

三維圖形幾何變換算法實驗_計算機視覺方向簡介 | 深度學習視覺三維重建

點擊上方“計算機視覺life”,選擇“星標”快速獲得最新干貨作者: Moonsmilehttps://zhuanlan.zhihu.com/p/79628068本文已由作者授權,未經允許,不得二次轉載三維重建意義三維重建作為環境感知的關鍵技術之一,可用于自動…

讀《高效程序員的45個習慣——敏捷開發修煉之道》

本書主要用平易的語言講述了45個有助于提高程序員自身敏捷的習慣,個人感覺這種老外寫的書翻譯成中文就少了很多意思。 主要的45個習慣是: 做事欲速則不達對事不對人排除萬難跟蹤變化對團隊投資懂得丟棄打破沙鍋問到底把握開發節奏讓客戶做決定讓設計指導…

Java線程CAS原子操作

這次分享一些關于原子操作(CAS)的東西. 定義 CAS(Compare And Swap)是CPU的一個指令級別的操作,叫原子操作,原子操作是不可分割的,跟事務差不多,要么全部執行完成,要么不執行; 像這種操作有點類似阻塞鎖…

python 導航欄_解析導航欄的url--selnium,beautifulsoup實戰

前段時間做ui自動化測試的時候,導航欄菜單始終有點問題,最后只好直接獲取到url,然后直接使用driver.get(url)進入頁面;包括做壓測的時候,比如我要找出所有報表菜單的url,這樣不可能手動去一個一個找出來&am…

PNG圖片詳解

1、PNG圖片類型 PNG格式有8位、24位、32位三種,下面是一些術語: 索引透明:類似于GIF,某一像素只有全透和全不透明兩種效果Alpha透明:半透明PNG8 8位的PNG最多支持256(2的8次方)種顏色&#xff0…

Java并發編程之顯式鎖(Lock)使用

又是一個基于AQS好用的類,看來下次有必要看看AQS了,正好又是放假。 既然叫顯式鎖,必然也有隱式鎖,也就是所謂的synchronzied關鍵字,它們兩者的區別呢在于使用范圍,synchronzied關鍵字的使用范圍比Lock要小…

python pychart三維_詳解python模塊pychartdir安裝及導入問題

在遷移別人寫好的腳本時,發現pychartdir沒有導入,腳本執行報錯。以下是報錯內容:[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安裝和使用

Ctags是一個用來為源文件中的標識符(如變量、函數、類成員、宏定義等)創建索引文件的程序。這些tags文件能被編輯器或其它工具用來快速查找定位源代碼中的符號(tag/symbol),如變量名,函數名等。 Tags文件中…

Java并發編程之AbstractQueuedSynchronizer(AQS)源碼解析

自己一個人隨便看看源碼學習的心得,分享一下啦,不過我覺得還是建議去買本Java并發編程的書來看會比較好點,畢竟個人的理解有限嘛。 獨占鎖和共享鎖 首先先引入這兩個鎖的概念:獨占鎖即同一時刻只有一個線程才能獲取到鎖&#xf…

采集用python還是火車頭_我才知道爬蟲也可以醬紫--火車采集器

我才知道爬蟲還可以這樣—火車采集器的使用說在前面額。。。好吧,我這一個三毛錢的屌絲也開始步入實習階段了,在北京其實也挺好的,雖說壓力大,但是今后就業機會也相對而言大一些。好了,說回今天的主題,之前…

mvn 使用中的錯誤

出現這種錯誤的時候:mvn Error building POM may not be this projects POM,報的是那個jar 包,就刪除那個jar 包,重新mvn clean install .ok

Java并發編程之FutureTask源碼解析

上次總結一下AQS的一些相關知識,這次總結了一下FutureTask的東西,相對于AQS來說簡單好多呀 之前提到過一個LockSupport的工具類,也了解一下這個工具類的用法,這里也鞏固一下吧 /*** Makes available the permit for the given th…

java 刪除二維數組中的null_避免在Java中檢查Null語句

1.概述通常,在Java代碼中處理null變量、引用和集合很棘手。它們不僅難以識別,而且處理起來也很復雜。事實上,在編譯時無法識別處理null的任何錯誤,會導致運行時NullPointerException。在本教程中,我們將了解在Java中檢…

Java并發編程之并發容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相關代碼,感覺JDK1.7和JDK1.8差別挺大的,這次先看下JDK1.7是怎么實現的吧 哈希(hash) 先了解一下啥是哈希(網上有很多介紹),是一種散列函數,簡單來…

帶控制端的邏輯運算電路_分別完成正整數的平方、立方和階乘的運算verilog語言...

練習:設計一個帶控制端的邏輯運算電路,分別完成正整數的平方、立方和階乘的運算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…

Java并發編程之并發容器ConcurrentHashMap(JDK1.8)解析

這個版本ConcurrentHashMap難度提升了很多,就簡單的談一下常用的方法就好了,可能有些講的不太清楚,麻煩發現的大佬指正一下 主要數據結構 1.8將Segment取消了,保留了table數組的形式,但是不在以HashEntry純鏈表的形式…

simulink顯示多個數據_如何在 Simulink 中使用 PID Tuner 進行 PID 調參?

作者 | 安布奇責編 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文為一篇技術干貨,主要講述在Simulink如何使用PID Tuner進行PID調參。PID調參器( PIDTuner)概述1.1 簡介使用PID Tuner可以對Simulink模型中的PID控制器,離散PID控制器,兩自由度PID控制…

Java并發編程之堵塞隊列介紹以及SkipList(跳表)

堵塞隊列 先了解一下生產者消費者模式: 生產者就是生產數據的一方,消費者就是消費數據的另一方。在多線程開發中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完,才能繼…

python生成list的時候 可以用lamda也可以不用_python 可迭代對象,迭代器和生成器,lambda表達式...

分頁查找#5.隨意寫一個20行以上的文件(divmod)# 運行程序,先將內容讀到內存中,用列表存儲。# l []# 提示:一共有多少頁# 接收用戶輸入頁碼,每頁5條,僅輸出當頁的內容def read_page(bk_list,n,endlineNone):startline …