2008-08-29 2 views
5

.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이 표시 될 것으로 예상됩니다.

답변

4

SP1에서 foo.Bar 속성이 제대로 deserialize됩니까?

SP1 이전 버전에서는 Bar 속성의 set 메서드가 private이므로 XmlSerializer에서 해당 값을 설정할 수있는 방법이 없기 때문에 개체를 deserialize 할 수 없습니다. SP1이 어떻게 작동하는지 잘 모르겠습니다.

당신은 당신의 Web.config이 추가 시도 할 수 /의 app.config

<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

C에 XmlSerializer를에 의해 생성 된 클래스 넣어 것입니다 : 당신이 대 SP1에서 무엇을하고 있는지 볼 수 있도록 foo는 \를 RTM

+1

이 문제는 .NET 4에서 수정되지 않은 것으로 보입니다. – Levitikon

0

XML 문서에 Bar에 대한 언급이 없으므로이 새로운 (?) 동작이 마음에 들었습니다. 따라서 디시리얼라이저는 설정을 시도하지 않아야합니다.