serialize serializar objeto net example convertir clase xml serialization .net-3.5

serializar - XmlSerializer cambia en.NET 3.5 SP1



xmlserializer class (2)

En SP1, ¿la propiedad foo.Bar se deserializa correctamente?

En el pre SP1, no se podría deserializar el objeto porque el método set de la propiedad Bar es privado, por lo que el XmlSerializer no tiene una manera de establecer ese valor. No estoy seguro de cómo SP1 lo está logrando.

Puede intentar agregar esto a su web.config / app.config

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

Eso colocará la clase generada por el XmlSerializer en c: / foo para que pueda ver lo que está haciendo en SP1 vs RTM

He visto bastantes publicaciones sobre cambios en .NET 3.5 SP1, pero tropecé con uno que aún no he visto la documentación de ayer. Tenía código funcionando bien en mi máquina, desde VS, línea de comandos de msbuild, todo, pero falló en el servidor de compilación (ejecutando .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; } }

En SP1, el código anterior funciona bien. En RTM, obtienes una InvalidOperationException:

No se puede generar una clase temporal (resultado = 1). error CS0200: No se puede asignar a la propiedad o indizador ''ConsoleApplication2.Foo.Bar'' - es de solo lectura

Por supuesto, todo lo que se necesita para hacer que se ejecute en RTM es agregar [XmlIgnore] a la propiedad Bar.

Mi Google Fu aparentemente no está a la altura de encontrar documentación sobre este tipo de cambios. ¿Hay alguna lista de cambios en algún lugar que enumere este cambio (y cambios similares en el interior que podrían saltar y gritar "gotcha")? ¿Es esto un error o una característica?

EDITAR : en SP1, si agregué un elemento <Bar /> , o configuré [XmlElement] para la propiedad Bar, no se deserializará. No falla antes de SP1 cuando intenta deserializar: lanza una excepción cuando se construye el XmlSerializer.

Esto me hace inclinarme más hacia que sea un error, especialmente si configuro un atributo [XmlElement] para Foo.Bar. Si no puede hacer lo que le pido que haga, debería lanzar una excepción en lugar de ignorar silenciosamente a Foo.Bar. Otras combinaciones / configuraciones no válidas de atributos de serialización XML dan como resultado una excepción.

EDITAR : Gracias, TonyB, no sabía sobre la configuración de la ubicación de los archivos temporales. Para aquellos que se encuentran con problemas similares en el futuro, necesitas un indicador de configuración adicional:

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

Incluso con la configuración de un atributo [XmlElement] en la propiedad Bar, no se hizo mención de ello en el ensamblaje de serialización generado, lo que con bastante firmeza coloca esto en el ámbito de un error silencioso (también conocido como error). O eso o los diseñadores han decidido que [XmlIgnore] ya no es necesario para las propiedades que no pueden configurarse, y esperaría ver eso en las notas de la versión, en las listas de cambios o en la documentación de XmlIgnoreAttribute .


Me gusta bastante este nuevo comportamiento (?) Porque el documento XML no tiene ninguna mención de Bar en él, por lo que el deserializador ni siquiera debería intentar configurarlo.