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.mzph.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 …