2010-02-14 15 views
5

Estoy tratando de agregar serialización XML a una estructura de clase 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):Serialize List <> de clases declaradas con modificador interno?

[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 éstos clases que se serializarán juntas, es decir, si serializo AClass, su lista de AnotherClass también se serializa (vea this question).

Tengo esta trabajando sobre todo, pero el problema es que durante la serialización, XmlSerializer sólo parece querer tratar con public propiedades 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 alguna manera de que pueda hacer que XmlSerializer serialice recursivamente listas de objetos que están declarados como internos?

+0

+1 para la pregunta porque se supone que las propiedades tienen que ser públicas * porque eso es lo que nos han dicho *. A veces pienso que muchos de nosotros nos detenemos en el punto en que nos dicen que no podemos hacer algo sin pedir alternativas. – IAbstract

Respuesta

6

Está en el camino correcto ... excepto que la serialización real no la realiza System.Xml, sino un ensamblaje generado dinámicamente. No puede predecir el nombre de ese ensamblaje (se genera aleatoriamente), por lo que no puede usarlo en el atributo InternalsVisibleTo.

La única solución es pregenerar el ensamblaje de serialización XML. Puedes hacerlo usando el XML Serializer Generator Tool (Sgen.exe). El nombre del ensamblado generado será "YourAssembly.XmlSerializers"; ese es el nombre que debe usar en el atributo InternalsVisibleTo.

+0

¡No conocía esa herramienta! +1 de mi parte –

+0

+1 @Thomas: eso es bueno saberlo. ¿Has probado esto todavía? – IAbstract

+0

Y, btw ... gran explicación sobre por qué el atributo 'InternalsVisibleTo' no funcionará en este caso !!! – IAbstract

1

La idea de agregar el atributo InternalsVisibleTo es buena, pero creo que el problema es que el código de serialización Xml solo busca los tipos públicos en el ensamblado.
Que yo sepa, no hay forma de hacer que XmlSerializer serialice o deserialice los tipos internos, y tendrá que declarar los tipos como públicos o escribir su propio código de serialización.
Además, el XmlSerializer class documentation establece explícitamente que solo las propiedades públicas del objeto se serializarán: "La serialización XML es el proceso de convertir las propiedades y campos públicos de un objeto a un formato serial (en este caso, XML) para almacenamiento o transporte", así que realmente parece que es una decisión de diseño.

+0

En realidad serializar los miembros internos funciona bien ... (ver mi respuesta) –

+0

Es posible serializar tipos internos con el XmlSerializer, pero en ese caso tendrá que escribir su propio serializador de tipo personalizado implementando IXmlSerializable en ese tipo específico (y el tipo en sí mismo debe ser público). – Steven