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,一经查实,立即删除!

相关文章

三维图形几何变换算法实验_计算机视觉方向简介 | 深度学习视觉三维重建

点击上方“计算机视觉life”,选择“星标”快速获得最新干货作者: Moonsmilehttps://zhuanlan.zhihu.com/p/79628068本文已由作者授权,未经允许,不得二次转载三维重建意义三维重建作为环境感知的关键技术之一,可用于自动…

PNG图片详解

1、PNG图片类型 PNG格式有8位、24位、32位三种,下面是一些术语: 索引透明:类似于GIF,某一像素只有全透和全不透明两种效果Alpha透明:半透明PNG8 8位的PNG最多支持256(2的8次方)种颜色&#xff0…

java 删除二维数组中的null_避免在Java中检查Null语句

1.概述通常,在Java代码中处理null变量、引用和集合很棘手。它们不仅难以识别,而且处理起来也很复杂。事实上,在编译时无法识别处理null的任何错误,会导致运行时NullPointerException。在本教程中,我们将了解在Java中检…

simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参。PID调参器( PIDTuner)概述1.1 简介使用PID Tuner可以对Simulink模型中的PID控制器,离散PID控制器,两自由度PID控制…

Java并发编程之堵塞队列介绍以及SkipList(跳表)

堵塞队列 先了解一下生产者消费者模式: 生产者就是生产数据的一方,消费者就是消费数据的另一方。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继…

Java并发编程之线程池ThreadPoolExecutor解析

线程池存在的意义 平常使用线程即new Thread()然后调用start()方法去启动这个线程,但是在频繁的业务情况下如果在生产环境大量的创建Thread对象是则会浪费资源,不仅增加GC回收压力,并且还浪费了时间,创建线程是需要花时间的&…

Java并发编程之线程定时器ScheduledThreadPoolExecutor解析

定时器 就是需要周期性的执行任务,也叫调度任务,在JDK中有个类Timer是支持周期性执行,但是这个类不建议使用了。 ScheduledThreadPoolExecutor 继承自ThreadPoolExecutor线程池,在Executors默认创建了两种: newSin…

Spring中BeanFactory和FactoryBean的区别

先介绍一下Spring的IOC容器到底是个什么东西&#xff0c;都说是一个控制反转的容器&#xff0c;将对象的控制权交给IOC容器&#xff0c;其实在看了源代码之后&#xff0c;就会发现IOC容器只是一个存储单例的一个ConcurrentHashMap<String, BeanDefinition> BeanDefiniti…

Spring中Aware的用法以及实现

Aware 在Spring当中有一些内置的对象是未开放给我们使用的&#xff0c;例如Spring的上下文ApplicationContext、环境属性Environment&#xff0c;BeanFactory等等其他的一些内置对象&#xff0c;而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性&#xff0c;一般…

Spring Bean的生命周期以及IOC源码解析

IOC源码这一块太多只能讲个大概吧&#xff0c;建议还是去买本Spring IOC源码解析的书来看比较好&#xff0c;我也是自己看源代码以及视频整理的笔记 Bean的生命周期大概可以分为四个阶段&#xff0c;具体的等会再说&#xff0c;先看看IOC的源码吧 1、bean的创建 2、bean的属…

MongoDB位运算基本使用以及位运算应用场景

最近在公司业务上用到了二进制匹配数据&#xff0c;但是MongoDB进行二进制运算&#xff08;Bitwise&#xff09;没用过&#xff0c;网上博客文章少&#xff0c;所以就上官网看API&#xff0c;因此记录一下&#xff0c;顺便在普及一下使用二进制位运算的一些应用。 在MongoDB的…

Mybatis源码日志模块分析

看源码需要先下载源码&#xff0c;可以去Mybatis的github上的仓库进行下载&#xff0c;Mybatis 这次就先整理一下日志这一块的源码分析&#xff0c;这块相对来说比较简单而且这个模块是Mybatis的基础模块。 之前的文章有谈到过Java的日志实现&#xff0c;大家也可以参考一下&…

python手机端给电脑端发送数据_期货交易软件有哪些比较好用?分手机端和电脑端...

一、电脑端交易软件期货电脑端交易软件目前市场上用的最多的是文华财经和博易大师&#xff0c;这两个软件都是免费交易使用的。从投资者使用角度来看&#xff0c;目前电脑端文华财经的评价比博易大师高一些。当然每个投资者有自己的使用习惯&#xff0c;博易大师也有自己优点&a…

Find the Difference(leetcode389)

2019独角兽企业重金招聘Python工程师标准>>> Given two strings s and t which consist of only lowercase letters. String t is generated by random shuffling string s and then add one more letter at a random position. Find the letter that was added in …

Mybatis源码之数据源模块分析

先来看看java纯jdbc查询数据的示例&#xff1a; try {//加载对应的驱动类Class.forName("com.mysql.cj.jdbc.Driver");//创建连接Connection connection DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezoneUTC", "roo…

Mybatis源码之缓存模块分析

缓存这个东西在很多应用中都能看到它们的身影&#xff0c;这次就讲讲在Mybatis中的缓存是怎么应用的&#xff0c;虽然说吧Mybatis中的缓存基本不怎么用&#xff0c;用的更多是第三方组件redis、MongoDB、MemCache等等。 Mybatis的缓存是基于Map实现的&#xff0c;从缓存中读写…

Mybatis源码之核心流程分析

终于谈到了Mybatis最核心的东西了&#xff0c;最核心的就是通过配置XML文件或注解中的SQL&#xff0c;直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据。 先看一下Mybatis使用示例&#xff1a; //创建Builder对象 SqlSessionFactoryBuilder builder new S…

Mybatis源码之与Spring集成包

这次讲讲Mybatis与Spring的整合&#xff0c;作为两款优秀的开源框架&#xff0c;被大众广泛使用&#xff0c;自然是需要强强联合的。 使用示例 先看一下怎么使用&#xff0c;首先需要引用这两款框架的jar包&#xff1a; <dependency>//spring-webmvc会自动去引入其他S…

Mybatis源码之插件模块分析

总结完这个Mybatis的整体主要功能基本上就差不多完&#xff0c;还有一些细节的部分&#xff0c;后续都会记录补充。 插件这个东西一般用的比较少&#xff0c;就算用的多的插件也算是PageHelper分页插件&#xff1b; PageHelper官网&#xff1a;https://github.com/pagehelper…