Как sgen.exe решает, для каких типов генерировать сериализаторы? - PullRequest
0 голосов
/ 19 июля 2011

Вы можете использовать sgen.exe для создания сборок сериализации заранее, а не создавать их на лету.

Но как он решает, для каких типов создавать сериализаторы?Я пытался перейти на использование sgen, но он говорил мне, что он не может найти какие-либо применимые типы.Есть ли атрибут, который вы должны добавить?Или мне нужно будет вручную указать типы?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я думаю, это потому, что типы не были публичными - XML-сериализация работает только с открытыми типами.

0 голосов
/ 22 марта 2017

Наиболее распространенная причина того, что sgen, запускаемый VS (т. Е. Через Свойства-> Сборка-> Создать сборку сериализации), на самом деле не производит сборку сериализации, заключается в том, что заданная по умолчанию задача сборки Sgen в VS включает в себя переключатель / proxytypes по умолчаниюнет способа выключить его.Этот переключатель указывает sgen генерировать сериализаторы только для типов прокси-серверов веб-службы Xml, как описано здесь .Чтобы создать сериализаторы для других типов, вы можете переопределить поведение по умолчанию, добавив собственную настраиваемую задачу, как описано в Создание сборки сериализации 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>
...