何时更改生成序列化程序集值?

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:

当不使用 XML 序列化程序生成器时,每次运行应用程序时,XmlSerializer 都会为每种类型生成序列化代码和序列化程序集。为了提高 XML 序列化启动的性能,请使用 Sgen.exe 工具预先生成这些程序集。然后可以将这些程序集与应用程序一起部署。

开启:在编译时使用 Sgen.exe 生成序列化程序集。这样可以节省启动时间,但会增加部署规模。 自动:发布配置的默认值。根据MSDN(感谢@L-Three),官方只在您的代码中使用XmlSerializer 时生成程序集。在我的测试中,这并不总是有效,因此如果您使用的是XmlSerializer,我建议将其明确设置为On

所以,我的答案是:如果您担心启动时间,并且您甚至使用过一次Serializable 属性,请将选项设置为“开”。如果您更关心部署大小,请将其更改为关闭。我再也不会把它留在 Auto 上了,因为我不相信它。就像我说的,它似乎与关闭相同,但我不会指望它。

编辑:我肯定在区分 Off 和 A​​uto 时遇到了一些麻烦。差异在任何地方都没有明确定义。如果您完全使用 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。

以上是关于何时更改生成序列化程序集值?的主要内容,如果未能解决你的问题,请参考以下文章

返回数据集值给出错误

为 protobuf-net 生成序列化程序集失败

在另一列mysql中显示结果集值

生成序列化程序集

获取结果集值的计数[重复]

Django:对查询集值使用自定义方法()