Andreas, 이것은 sgen 도구 자체의 문제는 아니며 XmlSerializer 구현 때문입니다.
형식 인수가 하나만있는 생성자를 사용하여 XmlSerializer의 인스턴스를 만들면 캐시를 검사하여 미리 생성 된 어셈블리를 찾습니다. 그러나 생성자를 XmlAttributeOverrides와 함께 사용하면 XmlSerializer는 캐시를 확인하지 않고 바로 temp 어셈블리를 생성합니다.
아마도 sgen과 같은 도구로 컴파일 타임에 "예견"할 수없는 XmlAttributeOverrides 인수를 사용하여 직렬화 논리가 상당히 변경 되었기 때문일 수 있습니다.
미리 컴파일 된 것이 필요한 경우 XmlAttributeOverrides를 피할 필요가 있습니다. 이것이 가능하지 않으면 필요한 XmlSerializer 인스턴스를 백그라운드 스레드에서 미리 만들어보십시오. 그냥 관심을
, 여기에 기본 생성자 코드입니다 (검사 캐시와 미리 생성 된 어셈블리를 찾습니다) :
public XmlSerializer(Type type, string defaultNamespace)
{
this.events = new XmlDeserializationEvents();
if (type == null)
{
throw new ArgumentNullException("type");
}
this.mapping = GetKnownMapping(type, defaultNamespace);
if (this.mapping != null)
{
this.primitiveType = type;
}
else
{
this.tempAssembly = cache[defaultNamespace, type];
if (this.tempAssembly == null)
{
lock (cache)
{
this.tempAssembly = cache[defaultNamespace, type];
if (this.tempAssembly == null)
{
XmlSerializerImplementation implementation;
Assembly assembly = TempAssembly.LoadGeneratedAssembly(type, defaultNamespace, out implementation);
if (assembly == null)
{
this.mapping = new XmlReflectionImporter(defaultNamespace).ImportTypeMapping(type, null, defaultNamespace);
this.tempAssembly = GenerateTempAssembly(this.mapping, type, defaultNamespace);
}
else
{
this.mapping = XmlReflectionImporter.GetTopLevelMapping(type, defaultNamespace);
this.tempAssembly = new TempAssembly(new XmlMapping[] { this.mapping }, assembly, implementation);
}
}
cache.Add(defaultNamespace, type, this.tempAssembly);
}
}
if (this.mapping == null)
{
this.mapping = XmlReflectionImporter.GetTopLevelMapping(type, defaultNamespace);
}
}
}
을 그리고 여기 XmlAttributeOverrides (항상 직렬화를 생성에 사용되는 생성자 어셈블리) :
public XmlSerializer(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, string defaultNamespace, string location, Evidence evidence)
{
this.events = new XmlDeserializationEvents();
if (type == null)
{
throw new ArgumentNullException("type");
}
XmlReflectionImporter importer = new XmlReflectionImporter(overrides, defaultNamespace);
for (int i = 0; i < extraTypes.Length; i++)
{
importer.IncludeType(extraTypes[i]);
}
this.mapping = importer.ImportTypeMapping(type, root, defaultNamespace);
if (location != null)
{
this.DemandForUserLocation();
}
this.tempAssembly = GenerateTempAssembly(this.mapping, type, defaultNamespace, location, evidence);
}
어디에서 더 여기에 왔습니까? – Rory