Domanda

Ho visto diversi post sulle modifiche in .NET 3.5 SP1, ma ieri ne ho trovato uno di cui non ho ancora visto la documentazione.Il codice funzionava perfettamente sul mio computer, da VS, riga di comando msbuild, tutto, ma non funzionava sul server di compilazione (che esegue .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; }
}

In SP1, il codice sopra funziona perfettamente.In RTM, ottieni un'eccezione InvalidOperationException:

Impossibile generare una classe temporanea (risultato=1).errore CS0200:Non è possibile assegnare la proprietà o l'indicizzatore "ConsoleApplication2.Foo.Bar": è di sola lettura

Naturalmente, tutto ciò che serve per farlo funzionare in RTM è aggiungere [XmlIgnore] alla proprietà Bar.

Apparentemente il mio Google Fu non è in grado di trovare documentazione di questo tipo di modifiche.Esiste un elenco di modifiche da qualche parte che elenca questa modifica (e modifiche simili nascoste che potrebbero saltare fuori e gridare "capito")?È un bug o una funzionalità?

MODIFICARE:In SP1, se aggiungessi un file <Bar /> o impostare [XmlElement] per la proprietà Bar, non verrà deserializzato.Non fallisce prima di SP1 quando tenta di deserializzare: genera un'eccezione quando viene costruito XmlSerializer.

Questo mi fa propendere maggiormente per il fatto che si tratti di un bug, soprattutto se imposto un attributo [XmlElement] per Foo.Bar.Se non è in grado di fare ciò che gli chiedo, dovrebbe lanciare un'eccezione invece di ignorare silenziosamente Foo.Bar.Altre combinazioni/impostazioni non valide degli attributi di serializzazione XML generano un'eccezione.

MODIFICARE:Grazie, TonyB, non sapevo dell'impostazione della posizione dei file temporanei.Per coloro che riscontrano problemi simili in futuro, è necessario un flag di configurazione aggiuntivo:

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

Anche impostando un attributo [XmlElement] sulla proprietà Bar, non ne è stata fatta alcuna menzione nell'assembly di serializzazione generato, il che lo colloca abbastanza saldamente nell'ambito di un errore inghiottito silenziosamente (ovvero un bug).Oppure i progettisti hanno deciso che [XmlIgnore] non è più necessario per le proprietà che non possono essere impostate e ti aspetteresti di vederlo nelle note di rilascio, modificare le liste, o il Documentazione XmlIgnoreAttribute.

È stato utile?

Soluzione

In SP1 la proprietà foo.Bar viene deserializzata correttamente?

Nelle versioni precedenti a SP1 non saresti in grado di deserializzare l'oggetto perché il metodo set della proprietà Bar è privato, quindi XmlSerializer non ha un modo per impostare quel valore.Non sono sicuro di come SP1 se la stia cavando.

Potresti provare ad aggiungerlo al tuo web.config/app.config

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

Ciò inserirà la classe generata da XmlSerializer in c:\foo in modo da poter vedere cosa sta facendo in SP1 rispetto a RTM

Altri suggerimenti

Mi piace questo nuovo (?) comportamento perché il documento XML non contiene alcuna menzione di Bar, quindi il deserializzatore non dovrebbe nemmeno tentare di impostarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top