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 上添加如下语句:

using Microsoft.Xml.Serialization.GeneratedAssembly;

Step #03:修改 Cards.Load 和 Cards.Save 的实现,我们需要做的仅仅是把原来的

XmlSerializer serializer = new XmlSerializer(typeof(Cards));

换成

XmlSerializer 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。

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

  1. VS中生成时“sgen.exe”已退出,代码为 1解决办法

    visual studio 2010 选定web项目,右键选择"属性"-"生成",将"生成序列化程序集"设成"关闭". ...

  2. 利用XMLSerializer将对象串行化到XML

    微软已经意识到串行化数据的重要性,因此在.NET框架中包含了命名空间System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能,为用户自 ...

  3. 程序“[4176] char.exe: 本机”已退出,返回值为 0 (0x0)

    使用VS2010运行程序,黑屏一闪而过,说程序"[4176] char.exe: 本机"已退出,返回值为 0 (0x0) 解决方法是: 在引用头文件时,加上#include &qu ...

  4. Intel.VTune.Performance.Analyzer.v8.0.014 分析软件

    为什么80%的码农都做不了架构师?>>>    Intel.VTune.Performance.Analyzer.v8.0.014 分析软件 Introduction_to_Ther ...

  5. vs2012 发布网站时出现 sgen.exe 已退出 代码为 1

    转载于:https://www.cnblogs.com/forthelichking/p/4436903.html

  6. 指定的任务可执行文件“sgen.exe”未能运行。System.ComponentModel.Win32Exception

    改成自动

  7. Intel.VTune.Performance.Analyzer.v8.0.014.ISO下载

    http://down.gogobox.com.tw/kisser/7ir3 不过下载的时候要安装一个ActiveX插件的

  8. windows 安装Nginx服务

    1.下载windows版的Nginx安装包,进入类似下图页面,选择合适版本下载. 下载后解压,如下图 在C:\Program Files路径下创建Nginx文件夹,把解压后的内容放在Nginx文件下 ...

  9. 【WP7】对象序列化

    在WP7中,经常需要使用到保存数据,对对象的保存可以通过序列化到流,然后保存到文件中 常用的有三种序列化方式:xml,Json,DataContract 下面介绍着三种序列化的使用 首先,定义一个序列 ...

最新文章

  1. 第八章 Health Check
  2. ansys18安装以后打不开_Ubuntu18.04安装Python各个版本之后导致终端无法打开的解决办法...
  3. 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写...
  4. noip2017考前基础复习——数论数学
  5. 直接往res里面写字节
  6. hdu 2191 多重背包入门
  7. linux目录统计编程,linux系统编程----统计一个目录下的普通文件个数
  8. 体育场[带权并查集]
  9. RHEL6入门系列之三十,服务管理
  10. php设计模式的六大原则(六):迪米特法则
  11. android编译系统apk文件,VS2012中MonoForAndroid打包编译APK文件详细图文教程
  12. 解读金融高频交易不出错的金手指:分布式事务管理
  13. 当今年轻人创业,什么行业最有前途
  14. webpack笔记一:webpack的介绍,安装,加载css、图片、字体等
  15. 解决cxgrid主从表数据显示不全的问题
  16. Linux有关知识补充
  17. 我在 CSDN 的小窝
  18. 暑假学习打卡【4】——北理工乐学第四周作业
  19. 基本概念学习(8006)--南桥芯片
  20. matlab兔子问题,【matlab】狼追击兔子问题的建模

热门文章

  1. Python reload 函数 - Python零基础入门教程
  2. android 里程,鹰眼Android SDK | 百度地图API SDK
  3. python绘制四边螺旋线代_解决python彩色螺旋线绘制引发的问题
  4. opengl 深度详解_一步步学OpenGL(23) -《阴影贴图1》
  5. 切片分析报告格式_社科论文写作101-APA数据分析结果报告格式
  6. python金融数据怎么获取_class类怎样在python中获取金融数据?
  7. 路由器装上去没有网络_5G网络那么快,今后路由器没有存在的价值了?
  8. java随机整数_java如何产生1-8的整数随机数?
  9. magento php 所需模块,magento博客 - Magento2 创建基本模块
  10. 对java这门课程的认识_关于java课程的总结