2010-10-08 14 views
9

Tengo problemas con la serialización de valores enum.serialización XML de enumeraciones

Aquí está el código:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public class REQUEST 
{ 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string ID; 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public REQUESTTypetype Type; 
} 

public enum REQUESTTypetype 
{ 
    One, 
    Two, 
    Three, 
    Four, 
} 

... 

REQUEST request = new REQUEST(); 
request.ID = "1234"; 
request.Type = REQUESTTypetype.One; 

XmlDocument doc = new XmlDocument(); 
MemoryStream ms = new MemoryStream(); 
StreamWriter sw = new StreamWriter(ms); 
XmlSerializer xs = new XmlSerializer(typeof(REQUEST)); 
xs.Serialize(sw, request_group); 
ms.Position = 0; 
doc.Load(ms); 
TestWriteXml(doc, @"C:\xml_test.xml"); 

El resultado es:

<?xml version="1.0" encoding="utf-8" ?> 
<REQUEST ID="1234" /> 

Por qué la enumeración no es de serie? Yo uso .NET Framework 2.0.

Gracias.

+1

Supongo que aquí falta algo en el código, está serializando "xs.Serialize (sw, request_group)", pero establece el valor para "request". ¿Cuál es la definición de request_group, tiene el tipo establecido? – pstrjds

+0

debe ser "solicitud", solo cambio los nombres un poco. – etarvt

+1

¿Cuál es el código para su función TestWriteXml? – pstrjds

Respuesta

0

Puede usar el atributo Xml.Serialization.XmlEnum (see here) para decorar los valores de la enumeración.

Hay una publicación de blog de Kurt Claeys here que también podría ayudar.

+0

Intenté esto pero no funcionó. – etarvt

-2

Intenta poner el atributo [Flags] en la enumeración.

+5

Eso es absolutamente irrelevante para la serialización. – VladV

+0

@vladv - aunque podría no aplicarse aquí, hay ocasiones en que [Banderas] importa para la serialización. OMI una respuesta válida como algo para comprobar, especialmente pensando en la "cola larga". –

+0

Estoy de acuerdo con usted. my Bad – rauts

2

¿Ve el mismo problema cuando establece el tipo en "Dos" o "Tres"? ¿Es porque "Uno" es el valor predeterminado y, por lo tanto, se puede suponer? Puede ser un artefacto de cargar esto en un XmlDocument y luego guardarlo con su código que no ha mostrado (TestWriteXml).

Esta versión ligeramente modificada de su código (que estoy escribiendo a un StringBuilder y luego ToString'ing al final) ...

REQUEST request = new REQUEST(); 
    request.ID = "1234"; 
    request.Type = REQUESTTypetype.One; 


    StringBuilder sb = new StringBuilder(); 
    StringWriter sw = new StringWriter(sb); 
    XmlSerializer xs = new XmlSerializer(typeof(REQUEST)); 
    xs.Serialize(sw, request); 
    Console.WriteLine(sb.ToString()); 

... usando los mismos tipos exactos como usted menciona arriba parece funcionar bien. Me sale esto en la consola ...

<?xml version="1.0" encoding="utf-16"?> 
<REQUEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:/ 
/www.w3.org/2001/XMLSchema" ID="1234" Type="One" /> 

no cambiaba la definición de solicitud o la REQUESTTypetype enumeración.

+0

Estaba haciendo lo mismo y obteniendo los mismos resultados básicos. Creo que el problema está en tu función TestWriteXml. – pstrjds

+0

Acabo de probar el ejemplo que di aquí y funciona bien. Sin embargo, mi xml es mucho más grande que este con muchos elementos derivados, etc. y la serialización ignora cada tipo de enumeración en el XML resultante. ¿Alguna idea de qué parte del código debería publicar para aclarar las cosas? – etarvt

+0

Sugiero comenzar con su ejemplo y agregar cosas nuevamente hasta que ya no funcione. Supongo que en algún lugar de la línea (clase de hijo o nieto) le falta un atributo, o borrar algo. – pstrjds

0

En su código real, es el miembro:

  • pública
  • lectura + escritura (para los campos: no sólo lectura; para las propiedades de: obtener público + set)
  • de un tipo de público

?

Todos los 3 deben ser ciertos. Para los tipos anidados, cada tipo principal en el anidamiento debe ser público.

cosas adicionales que excluirían que:

  • anulable y nula
  • es si ValorPredeterminado
  • un ShouldSerialize o especificado devueltos falsa
  • Es IXmlSerializable
+0

Además, en el caso de las clases (no enums) debe haber un constructor público sin parámetros. –

17

encontré lo estaba mal.Para cada tipo de enumeración

[System.Xml.Serialization.XmlAttributeAttribute()] 
public REQUESTTypetype Type; 

Tengo esto:

[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool TypeSpecified; 

Y en el código que debería hacer esto:

request.Type = REQUESTTypetype.One; 
request.TypeSpecified = true; 

Funciona bien ahora. Debería haberlos publicado en mi pregunta, pero no presté atención a estos miembros "especificados". Gracias por sus respuestas.