Pregunta

Estoy intentando añadir serialización XML a una estructura de clases bastante trivial en C #. En esencia, hay una sola instancia de una clase raíz (llámese AClass), que contiene una lista de varios casos de alguna otra clase (lo llaman AnotherClass):

[XmlRoot("RootNode")]
public class AClass {
    [XmlElement("ListNode")]
    internal List otherObjects { get; set; }
}

public class AnotherClass {
    [XmlAttribute("Name")]
    internal string name { get; set; }
}

Cuando seria, me gustaría tanto para estas clases para ser serializados juntos - es decir, si serializar AClass, su lista de AnotherClass se serializada también (véase esta pregunta ).

Tengo esta trabajando sobre todo, pero el problema es que durante la serialización, XmlSerializer sólo parece querer tratar con propiedades public de la clase -. Que no serializa AnotherClass en absoluto si la lista se declara internal

He intentado hacer partes internas de la asamblea visible para el serializador:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

Eso no parece hacer nada. ¿Hay una manera que puedo conseguir XmlSerializer para serializar de forma recursiva listas de objetos que se declaran interna?

¿Fue útil?

Solución

Usted está en el camino correcto ... excepto que la serialización real no se lleva a cabo por System.XML, sino por un ensamblado generado dinámicamente. No se puede predecir el nombre de esa asamblea (se genera de forma aleatoria), por lo que no se puede utilizar en el atributo InternalsVisibleTo.

La única solución es comprobar la validez de generar el ensamblado de serialización XML. Puede hacerlo utilizando el herramienta Generador de serializador (Sgen.exe) . El nombre del conjunto generado será "YourAssembly.XmlSerializers"; ese es el nombre que hay que utilizar en el atributo InternalsVisibleTo.

Otros consejos

La idea de añadir el atributo InternalsVisibleTo es buena, pero creo que el problema es que el código de serialización XML sólo busca los tipos públicos de la asamblea.
Que yo sepa, no hay ninguna manera de hacer XmlSerializer serializar o deserializar tipos internos, y usted tendrá que declarar los tipos ya sea como público o escribir su propio código de serialización.
Por otra parte, el href="http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx" rel="nofollow noreferrer"> documentación de la clase XmlSerializer afirma explícitamente que sólo las propiedades públicas del objeto serán serializados: "serialización XML es el proceso de conversión de propiedades y campos públicos de un objeto a un formato de serie (en este caso, XML) para el almacenamiento o el transporte", por lo que realmente parece que es un diseño decisión.

scroll top