2009-01-09 21 views
6

¿Cuál es la forma más sencilla de hacer que XmlSerializer también serialice las propiedades privadas y de "público const" de una clase o estructura? Correcto, no todo lo que saldrá para mí son cosas que son solo públicas. Hacerlo privado o agregar const hace que los valores no se serialicen.Uso de XmlSerializer con propiedades privadas y públicas de const

+1

Por qué desea constantes a ser serializados ?! Parece que estás yendo por una ruta incorrecta. –

+0

Por definición, las constantes expuestas (es decir, públicas y protegidas) son algo que nunca va a cambiar. ¡Cambiar una constante pública es un cambio radical del cliente! Para algo que es simplemente constante para el funcionamiento de la aplicación, o para una versión particular de la aplicación, pero puede cambiar en el futuro, necesita usar campos 'readonly'. 'XmlSerializer' tampoco los manejará, pero es un asunto diferente. –

+0

Si desea serializar/deserializar miembros privados, consulte http://stackoverflow.com/questions/420662/can-an-internal-setter-of-a-property-be-serialized –

Respuesta

15

XmlSerializer solo se ve en campos públicos y propiedades. Si necesita más control, puede implementar IXmlSerializable y serializar lo que desee. Por supuesto, serializar una constante no tiene mucho sentido ya que no se puede deserializar a una constante.

3

Consulte DataContractSerializer, presentado en .NET 3.0. También utiliza el formato XML, y en muchos sentidos, es mejor que XmlSerializer, incluido el manejo de datos privados. Ver http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ para una comparación completa.

Si solo tiene .NET 2.0, está el Servidor Binario que puede tratar con datos privados, pero por supuesto es un formato binario.

+0

'Mejor' es discutible, por ejemplo , DataContractSerializer no le da ninguna flexibilidad sobre cómo se serializa el objeto. – nicodemus13

2

No tiene sentido considerar a los miembros const, ya que no son por instancia; pero si solo quiere decir miembros de instancias no públicas: considere DataContractSerializer (.NET 3.0) - esto es similar a XmlSerializer, pero puede serializar propiedades no públicas (aunque es "opt-in").

Ver here for more.

+2

La serialización del valor de una constante para un tiempo de ejecución particular tiene mucho sentido, si, por ejemplo, debe compararse con el valor en otro tiempo de ejecución. – Grault

+0

@Jesdisciple no realmente - porque de nuevo: este es un serializador de objetos (instancia) - y ese valor no pertenece al objeto (instancia). –

9

A pesar de que no es posible serializar propiedades privadas, puede serializar propiedades con un colocador interna, como éste:

public string Foo { get; internal set; } 

de hacer eso, es necesario comprobar la validez de generar el ensamblado de serialización con sgen. exe, y declarar este conjunto como amigo:

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")] 
0

otra solución el uso de Newtonsoft.Json:

var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result }); 
    var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json); 

Claro, este desafortunadamente se ha desviado a través de json.

0

aquí está mi solución para poner los valores inmutables en una propiedad que va a serializar a XML:

[XmlElement] 
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } } 
Cuestiones relacionadas