.NET 3.5 SP1의 변경 사항에 대해 많은 게시물을 보았지만 어제의 설명서는 아직 보지 못했습니다. 내 컴퓨터에서 VS, msbuild 명령 줄, 모든 것에서 정상적으로 작동하는 코드가 있었지만 빌드 서버 (.NET 3.5 RTM 실행)에서 실패했습니다..NET 3.5 SP1에서 XmlSerializer가 변경되었습니다.
[XmlRoot("foo")]
public class Foo
{
static void Main()
{
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
string xml = @"<foo name='ack' />";
using (StringReader sr = new StringReader(xml))
{
Foo foo = serializer.Deserialize(sr) as Foo;
}
}
[XmlAttribute("name")]
public string Name { get; set; }
public Foo Bar { get; private set; }
}
SP1에서 위 코드는 정상적으로 실행됩니다. RTM에서 InvalidOperationException이 발생합니다.
임시 클래스 (결과 = 1)를 생성 할 수 없습니다. 오류 CS0200 : 속성 또는 인덱서 'ConsoleApplication2.Foo.Bar이'에 할당 할 수 없습니다 - 그것은 단지 물론
읽기, 모든은 (는) 줄에 [XmlIgnore] 추가하고 RTM에서 실행하기 위해 필요한 재산.
google fu는 이러한 종류의 변경 사항에 대한 문서를 찾는 것이 아닙니다. 이 변경 사항을 나열하는 변경 목록이있는 곳이 있습니까? (변경 될 수있는 유사한 변경 사항이 뛰어 올라서 "잡았다")? 버그 또는 기능입니까?
편집 : <Bar />
요소를 추가하거나 Bar 속성에 [XmlElement]를 설정하면 SP1에서 deserialize되지 않습니다. deserialize 할 때 SP1 이전에 실패하지 않습니다. XmlSerializer가 생성 될 때 예외를 throw합니다.
이렇게하면 버그가 될 수 있습니다. 특히 Foo.Bar에 [XmlElement] 특성을 설정하면 더욱 그렇습니다. 내가 요구하는 것을 할 수 없다면 Foo.Bar를 자동으로 무시하는 대신 예외를 던져야합니다. XML 직렬화 속성의 다른 잘못된 조합/설정으로 인해 예외가 발생합니다.
EDIT : 감사합니다. TonyB, 임시 파일 위치 설정에 대해 알지 못했습니다. 생성 된 직렬화 어셈블리에 심지어 바 속성에 [XMLELEMENT] 속성을 설정하여
이<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
<system.xml.serialization>
<xmlSerializer tempFilesLocation="c:\\foo"/>
</system.xml.serialization>
, 언급은 그것을하지 않았다 : 향후 유사한 문제 건너 그들을 위해, 당신은 추가 설정 플래그를 필요합니까 - 이것을 조용히 삼킨 오류 (일명 버그)의 영역에 상당히 단호하게 넣습니다. 그 중 하나 또는 디자이너가 설정할 수없는 속성에 [XmlIgnore]가 더 이상 필요하지 않으며 릴리스 노트에 change lists 또는 XmlIgnoreAttribute documentation이 표시 될 것으로 예상됩니다.
이 문제는 .NET 4에서 수정되지 않은 것으로 보입니다. – Levitikon