输出存在设计限制。sgen
这个限制从未被删除:
这些生成的程序集不能用于 Web 服务的服务器端。此工具仅适用于 Web 服务客户端和手动序列化场景。
基本上,您不希望运行sgen
以使 Web 服务的服务器端更快,因为XmlSerializer
启动时间不是其性能的关键因素(与某些类型的客户端相比)。
当然,在非web服务的场景下sgen
也可以在服务端使用,只要不XmlAttributeOverrides
给XmlSerializer
.
使用 MSMQ,可以选择二进制和 XML 序列化,您的代码在此处选择后者:
qOrders.Formatter = New XmlMessageFormatter(New Type() {GetType(InfoMessage)})
那么让我们看看如何MessageQueue
创建一个XmlSerializer
. 以下是XmlMessageFormatter
取自System.Messaging.dll
.NET 4.0 的方法。它的 .NET 2.0 对应物是类似的。
private void CreateTargetSerializerTable()
{
if (!this.typeNamesAdded)
{
for (int index = 0; index < this.targetTypeNames.Length; ++index)
{
Type type = Type.GetType(this.targetTypeNames[index], true);
if (type != (Type) null)
this.targetSerializerTable[(object) type]
= (object)new XmlSerializer(type);
}
this.typeNamesAdded = true;
}
if (!this.typesAdded)
{
for (int index = 0; index < this.targetTypes.Length; ++index)
this.targetSerializerTable[(object) this.targetTypes[index]]
= (object)new XmlSerializer(this.targetTypes[index]);
this.typesAdded = true;
}
if (this.targetSerializerTable.Count == 0)
throw new InvalidOperationException(Res.GetString("TypeListMissing"));
}
如您所见,MSMQ 不提供XmlAttributeOverrides
,与框架中的 Web 服务服务器端代码不同。尽管如此,还有其他人在将XmlMessageFormatter和sgen
.
我的猜测是,sgen
它仍然可以与 MSMQ 一起使用,因为 MSMQ 不使用XmlAttributeOverrides
,但是您必须确保您没有使用proxytypes
命令行选项,并且您仍然在 Microsoft 测试过的范围之外。
我建议看看这些可能性:
- 避免
sgen
与 MSMQ 一起使用。
- 避免将
/proxytypes
选项与sgen
.
- 如果您从项目文件
SGenUseProxyTypes
中调用,请禁用(查看此处了解如何)。sgen
- 看看使用 MSMQ 的二进制序列化。
- 密切注意您通过客户端队列发送的类型。