何时更改生成序列化程序集值?
Posted
技术标签:
【中文标题】何时更改生成序列化程序集值?【英文标题】:When to change the Generate Serialization Assembly value? 【发布时间】:2012-02-29 12:42:53 【问题描述】:我有一个客户端 winform 应用程序连接到 WCF 的本地网络服务器。 客户端出现性能问题,我搜索了解决方法,发现this发帖。
上面写着:
这听起来像是在运行时创建的序列化程序集。尝试 更改底部的序列化程序集下拉菜单的设置 项目属性窗口的“构建”窗格。
我的问题是何时更改 Generate Serialization Assembly 值,我应该将其更改为什么值以提高客户端应用程序的性能?
我的代码是 C#,框架 4,在 VS2010Pro 中构建。
【问题讨论】:
【参考方案1】:为了序列化类/结构,需要生成序列化程序集。这可能发生在编译时或运行时。 sgen.exe 用于在编译时生成序列化程序集;正如您所发现的,Visual Studio 可以选择自动执行此过程。
关闭:调试配置的默认设置(感谢@Alexandru Lache)。不要在编译时生成序列化程序集。每次应用程序运行时都会生成序列化程序集,根据MSDN:开启:在编译时使用 Sgen.exe 生成序列化程序集。这样可以节省启动时间,但会增加部署规模。 自动:发布配置的默认值。根据MSDN(感谢@L-Three),官方只在您的代码中使用当不使用 XML 序列化程序生成器时,每次运行应用程序时,XmlSerializer 都会为每种类型生成序列化代码和序列化程序集。为了提高 XML 序列化启动的性能,请使用 Sgen.exe 工具预先生成这些程序集。然后可以将这些程序集与应用程序一起部署。
XmlSerializer
时生成程序集。在我的测试中,这并不总是有效,因此如果您使用的是XmlSerializer
,我建议将其明确设置为On
。
所以,我的答案是:如果您担心启动时间,并且您甚至使用过一次Serializable
属性,请将选项设置为“开”。如果您更关心部署大小,请将其更改为关闭。我再也不会把它留在 Auto 上了,因为我不相信它。就像我说的,它似乎与关闭相同,但我不会指望它。
编辑:我肯定在区分 Off 和 Auto 时遇到了一些麻烦。差异在任何地方都没有明确定义。如果您完全使用 Serializable 属性,我会坚持使用 On,如果不使用,我会坚持使用 Off。我不会考虑部署规模或启动时间。如果我坚持这条规则,我似乎只会遇到更少的与序列化相关的错误。
更新:
在审查了上述来源后,我认为“启动”是指第一次在任何给定类型上使用 XmlSerializer
,而不是初始应用程序启动。我不能确定;有点模棱两可。
【讨论】:
感谢 Zenexer。真的很有帮助。 备注:[Serializable]
属性与二进制序列化有关,与 XML 序列化无关。因此,如果您使用 XmlSerializer
类并且担心(反)序列化第一个对象实例所需的时间,则应该考虑使用它。
当您说“所有形式的序列化”时,我相信您是在谈论.NET runtime serialization 使用的不同序列化格式化程序。但XmlSerializer
类与.NET运行时序列化无关,它是唯一使用这些生成的序列化程序集的类(运行时序列化和WCF数据协定不使用它们),与[Serializable]
无关属性。一个类只需要public
并且有一个公共的无参数构造函数,XmlSerializer
就可以工作。
我非常不同意你提到的这个“应该是”的约定。你在哪里读到的?如果一个类的公共成员可以被序列化,这并不意味着用运行时序列化来序列化它是安全的。您只是在创建潜在的安全和稳定性风险,允许对其私有字段进行不必要的序列化。见Drawbacks of marking a class as Serializable、Why classes are not Serializable by default?、Disadvantage of making class Serializable。
请注意 Auto on DEBUG 为 Off 并且 on RELEASE 为 On。以上是关于何时更改生成序列化程序集值?的主要内容,如果未能解决你的问题,请参考以下文章