2010-02-11 13 views
6

NetworkComponent sınıfındaki _updatedComponents nesneleri adlı bir dizilim var. Kök elemanın (= dizi) isminin ve ad alanının değiştirileceği ve bireysel NetworkComponent-maddesinin isminin bileşen olarak değiştirileceği şekilde serileştirmek zorundayım.Bir diziyi serileştirirken XmlAttributeOverrides nasıl kullanılır?

System.InvalidOperationException: Ben bunun altında bir kod bir istisna neden olan bir hata yansıtan tip 'ComponentSyncService.NetworkComponent []' vardı. ---> System.InvalidOperationException: ComponentSyncService.NetworkComponent [] türünde XmlRoot ve XmlType öznitelikleri belirtilmemiş olabilir.

Kodu:

_updatedComponents nedir
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

Sınıf oluşturulduğundan bu yana System.Xml.Serialization.XmlTypeAttribute tanımlarını değiştirmek istemediğimi ekleyebilirim ve böylece –

cevap

8

? Sanırım bu bir NetworkComponent[] - bu çok zor şeyler yapacak. Bir sarıcı yazmayı öneririm:

Doğru öznitelikleri ilişkilendirebilirsiniz. NetworkComponent'daki geçici özellikleri desteklemeniz gerekiyorsa, yine de öznitelik geçersiz kılmalarını kullanmanız gerekir (dolayısıyla yukarıdakileri hiç yapmadım), ancak ComponentsMessage öznitelikleri almaktan mutlu olmalıdır.

Alternatif olarak, ayrı bir DTO yazın ve değerleri eşleyin.

basit ise, sadece kullanmak mümkün olabilir:

[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; } 
} 

Alternatif olarak, zorunluluk kullanım öznitelik-geçersiz kılar, hala bir kapsayıcı nesnesi kullanmak olsaydınız:

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

cevabınız için yapılan değişiklikler, cevabınız için teşekkürler! Benim sorum olarak belirttiğim gibi: "NetworkComponent sınıfının nesnelerinin _updatedComponents adlı bir dizilim var." Sadece işi bırakıyorum, bu yüzden yarın deneyeceğim. Çok kötü, bu çok zor. Nedenini tam olarak anlamadım ... –

+0

tekrar teşekkürler! Düzenlenmiş cevabınızı sabah 1. şey kontrol edeceğim. –

+0

Basit sürümü denedim ve çalıştı. çok teşekkürler! XmlAttributeOverrides sürümünü sağlamak için çok çaba harcadım. Umarım gerçekten buna ihtiyacı olan bir başkasına yardım eder. –