2010-02-11 10 views
6

Tengo una matriz llamada _updatedComponents de objetos que son de clase NetworkComponent. Tengo que serializarlo de la misma manera en que cambian el nombre y el espacio de nombres del elemento raíz (= matriz) y el nombre individual del elemento NetworkComponent se cambia a componente. Tengo un código a continuación que causa una excepción:cómo usar XmlAttributeOverrides al serializar una matriz?

System.InvalidOperationException: Hubo un error que refleja el tipo 'ComponentSyncService.NetworkComponent []'. ---> System.InvalidOperationException: los atributos XmlRoot y XmlType no se pueden especificar para el tipo ComponentSyncService.NetworkComponent [].

Código:

XmlAttributeOverrides xaos = new XmlAttributeOverrides(); 

// the array itself aka the root. change name and namespace 
XmlElementAttribute xea = new XmlElementAttribute(_updatedComponents.GetType()); 
xea.Namespace = "http://www.example.com/nis/componentsync"; 
xea.ElementName = "components"; 

XmlAttributes xas = new XmlAttributes(); 
xas.XmlElements.Add(xea); 
xaos.Add(_updatedComponents.GetType(), xas); 

// then the items of the array. just change the name 
xea = new XmlElementAttribute(typeof(networkcomponent)); 
xea.ElementName = "component"; 

xas = new XmlAttributes(); 
xas.XmlElements.Add(xea); 
xaos.Add(typeof(NetworkComponent), "NetworkComponent", xas); 

XmlSerializer serializer = new XmlSerializer(_updatedComponents.GetType(), xaos); 

XmlTextWriter writer = new XmlTextWriter(string.Format("{0}\\ComponentSyncWS_{1}.xml", 
         Preferences.FileSyncDirectory, requestId), Encoding.UTF8); 
serializer.Serialize(writer, _updatedComponents); 
+0

podría agregar que no quiero cambiar las definiciones System.Xml.Serialization.XmlTypeAttribute ya que la clase se genera y por lo tanto los cambios se perderán cuando se regenere –

Respuesta

8

¿Cuál es _updatedComponents? Supongo que es un NetworkComponent[], lo que hará las cosas muy complicadas. Sugeriría escribir un tipo de envoltorio:

public class ComponentsMessage { 
    public NetworkComponent[] Components {get;set;} 
} 

Luego puede asociar los atributos correctos. Si necesita admitir atributos ad-hoc en NetworkComponent, deberá usar anulaciones de atributos (por lo tanto, no he decorado el anterior), pero ComponentsMessage estará encantado de tomar los atributos.

O bien, simplemente escriba un DTO por separado y haga un mapa de los valores.

Si es simple, que sólo podría ser capaz de utilizar:

[XmlRoot("components", Namespace = XmlNamespace)] 
[XmlType("components", Namespace = XmlNamespace)] 
public class ComponentsMessage 
{ 
    public const string XmlNamespace = "http://www.example.com/nis/componentsync"; 
    [XmlElement("component")] 
    public NetworkComponent[] Components { get; set; } 
} 

alternativa, si mosto uso de atributos-anulaciones, todavía tendría que utilizar un objeto envoltorio:

public class ComponentsMessage 
{ 
    public NetworkComponent[] Components { get; set; } 
} 
class Program 
{ 
    static void Main() 
    { 
     NetworkComponent[] _updatedComponents = new NetworkComponent[2] { 
      new NetworkComponent{},new NetworkComponent{} 
     }; 
     const string XmlNamespace = "http://www.example.com/nis/componentsync"; 
     XmlAttributeOverrides ao = new XmlAttributeOverrides(); 
     ao.Add(typeof(ComponentsMessage), new XmlAttributes { 
      XmlRoot = new XmlRootAttribute("components") { Namespace = XmlNamespace }, 
      XmlType = new XmlTypeAttribute("components") { Namespace = XmlNamespace } 
     }); 
     ao.Add(typeof(ComponentsMessage), "Components", new XmlAttributes { 
      XmlElements = { 
       new XmlElementAttribute("component") 
      } 
     }); 
     ComponentsMessage msg = new ComponentsMessage { Components = _updatedComponents }; 
     XmlSerializer serializer = new XmlSerializer(msg.GetType(), ao); 
     serializer.Serialize(Console.Out, msg); 
    } 
} 
+0

gracias por su respuesta! como afirmo en mi pregunta: "Tengo una matriz llamada _componentes actualizados de objetos que son de clase NetworkComponent". Solo me voy del trabajo, así que lo intento mañana. Lástima que sea complicado. No entendí por qué ... –

+0

¡gracias de nuevo! Comprobaré tu respuesta editada la primera cosa de la mañana. –

+0

probé la versión simple y funcionó. ¡muchas gracias! Pone mucho esfuerzo para proporcionar también la versión XmlAttributeOverrides. Espero que ayude a alguien más que realmente lo necesite. –

Cuestiones relacionadas