【发布时间】:2011-07-18 22:17:15
【问题描述】:
您可以使用sgen.exe 提前创建序列化程序集,而不是动态创建它们。
但它如何决定为哪些类型制作序列化程序?我试图切换到使用 sgen,但它一直告诉我它找不到任何适用的类型。有没有你必须添加的属性?还是需要手动指定类型?
【问题讨论】:
标签: .net xml-serialization sgen
您可以使用sgen.exe 提前创建序列化程序集,而不是动态创建它们。
但它如何决定为哪些类型制作序列化程序?我试图切换到使用 sgen,但它一直告诉我它找不到任何适用的类型。有没有你必须添加的属性?还是需要手动指定类型?
【问题讨论】:
标签: .net xml-serialization sgen
我猜这是因为类型不是公共的 - XML 序列化只适用于公共类型。
【讨论】:
VS 触发的 sgen(即通过 Properties->Build->Generate 序列化程序集)不实际生成序列化程序集的最常见原因是因为 VS 中的默认 Sgen 构建任务默认包含 /proxytypes 开关,并且没有办法将其关闭。此开关告诉 sgen 只为 Xml Web 服务代理类型生成序列化程序,如文档 here 所述。要为其他类型生成序列化程序,您可以通过添加您自己的自定义任务来覆盖默认行为,如Generating an Xml Serialization assembly as part of my build 中所述。您可以更进一步,通过 Types 参数仅指定您希望为其生成序列化代码的类型,例如:
<PropertyGroup>
<!-- Specific set of types to create serialization assemblies for -->
<SerializationTypes>
Type1;
Type2
</SerializationTypes>
</PropertyGroup>
<!-- Custom non-proxy SGEN invocation to create pre-compiled serialization assemblies -->
<Target Name="GenerateNonProxySerializationAssemblies"
DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
Outputs="$(OutputPath)$(_SGenDllName)">
<SGen BuildAssemblyName="$(TargetFileName)" Types="$(SerializationTypes)"
BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)"
ShouldGenerateSerializer="true" UseProxyTypes="false"
KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)"
DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
【讨论】: