sgen.exe如何决定为哪些类型生成序列化器?

时间:2011-07-18 22:17:15

标签: .net xml-serialization sgen

您可以使用sgen.exe提前创建序列化程序集,而不是动态创建它们。

但它如何决定制作序列化器的类型?我试图切换到使用sgen,但它一直在告诉我它找不到任何适用的类型。是否有必须添加的属性?或者我需要手动指定类型吗?

2 个答案:

答案 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>