0

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

但是它如何决定为哪些类型制作序列化程序?我试图切换到使用 sgen,但它一直告诉我它找不到任何适用的类型。有没有你必须添加的属性?还是我需要手动指定类型?

4

2 回答 2

1

我猜这是因为类型不是公共的——XML 序列化只适用于公共类型。

于 2011-07-18T22:35:49.710 回答
0

VS 触发的 sgen(即通过 Properties->Build->Generate 序列化程序集)实际上没有生成序列化程序集的最常见原因是因为 VS 中默认的 Sgen 构建任务默认包含 /proxytypes 开关,并且没有关闭它的方法。此开关告诉 sgen 只为 Xml Web 服务代理类型生成序列化程序,如此所述。要为其他类型生成序列化程序,您可以通过添加自己的自定义任务来覆盖默认行为,如生成 Xml 序列化程序集作为我的构建的一部分中所述。您可以更进一步,仅指定您希望通过 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>
于 2017-03-21T22:40:54.820 回答