您可以使用sgen.exe
提前创建序列化程序集,而不是动态创建它们。
但它如何决定制作序列化器的类型?我试图切换到使用sgen,但它一直在告诉我它找不到任何适用的类型。是否有必须添加的属性?或者我需要手动指定类型吗?
答案 0 :(得分:1)
我猜这是因为类型不公开 - XML序列化仅适用于公共类型。
答案 1 :(得分:0)
VS触发的sgen(即通过Properties-> Build->生成序列化程序集)实际上不生成序列化程序集的最常见原因是因为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>