【问题标题】:How does sgen.exe decide which types to generate serializers for?sgen.exe 如何决定为哪些类型生成序列化程序?
【发布时间】:2011-07-18 22:17:15
【问题描述】:

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

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

【问题讨论】:

    标签: .net xml-serialization sgen


    【解决方案1】:

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

    【讨论】:

    • 虽然如此,但我的类型确实是公开的。我现在从 VS 之外的命令行调用 sgen ,它似乎正在工作。我现在不确定是什么导致了这个错误。
    【解决方案2】:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多