He consumido un paquete nuget de terceros que admitía .net core y .net framework (estándar .net).

Mi proyecto era un proyecto .net framework 4.62 y cuando usé ese tercero, recibí una excepción del XmlSerializer.

El problema se debió a un captador privado en una propiedad.

Solo se pueden serializar campos y propiedades públicas. Las propiedades deben tener descriptores de acceso públicos (métodos get y set). Si necesita serializar datos no públicos, use la clase BinaryFormatter en lugar de la serialización XML.

Fuente completa

Después de recibir ese error, intenté abrir un proyecto .net core 2.2, consumí el mismo nuget de terceros y vi que el mismo código funcionaba allí.

Es un pequeño ejemplo de código que reproduce el problema:

public class Test
{
    public string TestProp { private get; set; }
}

// Exception on .net 462 and works on .net core 2.2
var serializer = XmlSerializer.FromTypes(new[] { typeof(Test) });

Entonces, ¿es esto un error en la implementación del núcleo de .net o una característica? ¿Hay algo que pueda hacer para admitir esto en .net framework sin bifurcar el repositorio y corregir el código?

4
Amir Popovich 17 oct. 2019 a las 11:19

1 respuesta

La mejor respuesta

El "error" aquí es que falla en un momento diferente; en net462 falla durante FromTypes; en netcoreapp2.2 y netcoreapp3.0, falla durante el Serialize, con:

System.InvalidOperationException: se produjo un error al generar el documento XML. ---> System.MethodAccessException: el intento por el método 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTest.Write2_Test (System.String, System.String, Test, Boolean, Boolean)' para acceder al método 'Test.get_TestProp ()' falló

Entonces ... realmente no vale la pena preocuparse, IMO. No hay una diferencia real de característica , lo que quiero decir: no va a funcionar de ninguna manera. Así que ... ¿no hagas eso?

Pero: puede registrarlo como un error en github e incluso enviar un PR para que falle antes, si realmente lo desea.

Dicho eso: si agrega:

public bool ShouldSerializeTestProp() => false;

Entonces realmente funcionará en netcoreapp2.2 y netcoreapp3.0, lo cual es ... bueno, ¿supongo? E incluso podría considerarse una razón no para cambiar el nuevo comportamiento.

2
Marc Gravell 17 oct. 2019 a las 08:29