문제

.NET 3.5 SP1의 변경 사항에 대한 게시물을 꽤 많이 보았지만 우연히 어제 문서를 보지 못한 게시물을 발견했습니다.VS, msbuild 명령줄 등 내 컴퓨터에서는 코드가 제대로 작동했지만 빌드 서버(.NET 3.5 RTM 실행)에서는 실패했습니다.

[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'를 할당할 수 없습니다. 읽기 전용입니다.

물론 RTM에서 실행하는 데 필요한 것은 Bar 속성에 [XmlIgnore]를 추가하는 것뿐입니다.

내 Google Fu는 이러한 종류의 변경 사항에 대한 문서를 찾는 데 적합하지 않은 것 같습니다.이 변경 사항(및 갑자기 "알았어"라고 외칠 수 있는 유사한 내부 변경 사항)을 나열하는 변경 목록이 있습니까?이것은 버그입니까 아니면 기능입니까?

편집하다:SP1에서 <Bar /> 요소를 설정하거나 Bar 속성에 [XmlElement]를 설정하면 역직렬화되지 않습니다.SP1 이전 버전에서는 역직렬화를 시도할 때 실패하지 않으며 XmlSerializer가 생성될 때 예외가 발생합니다.

이로 인해 특히 Foo.Bar에 [XmlElement] 속성을 설정한 경우 버그가 발생하는 경향이 더 커졌습니다.내가 요청한 작업을 수행할 수 없는 경우 Foo.Bar를 자동으로 무시하는 대신 예외를 발생시켜야 합니다.기타 잘못된 XML 직렬화 속성 조합/설정으로 인해 예외가 발생합니다.

편집하다:TonyB님, 감사합니다. 임시 파일 위치 설정에 대해 몰랐습니다.나중에 비슷한 문제가 발생하는 경우 추가 구성 플래그가 필요합니다.

<system.diagnostics>
  <switches>
    <add name="XmlSerialization.Compilation" value="1" />
  </switches>
</system.diagnostics>
<system.xml.serialization>
  <xmlSerializer tempFilesLocation="c:\\foo"/>
</system.xml.serialization>

Bar 속성에 [XmlElement] 특성을 설정하더라도 생성된 직렬화 어셈블리에서는 이에 대한 언급이 없었습니다. 이는 조용히 무시되는 오류(일명 버그) 영역에 해당된다는 점을 확실하게 보여줍니다.또는 디자이너는 설정할 수 없는 속성에 대해 [XmlIgnore]가 더 이상 필요하지 않다고 결정했으며 릴리스 노트에서 이를 볼 수 있을 것으로 예상합니다. 목록 변경, 아니면 그 XmlIgnoreAttribute 문서.

도움이 되었습니까?

해결책

SP1에서는 foo.Bar 속성이 적절하게 역직렬화됩니까?

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

이것을 web.config/app.config에 추가해 볼 수 있습니다.

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

그러면 XmlSerializer에 의해 생성된 클래스가 c:\foo에 배치되어 SP1과 RTM에서 수행되는 작업을 확인할 수 있습니다.

다른 팁

나는 XML 문서에 Bar에 대한 언급이 없기 때문에 이 새로운(?) 동작을 선호합니다. 따라서 역직렬 변환기는 Bar를 설정하려고 시도하지도 말아야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top