2009-08-18 7 views
6

Ich möchte die Erstellung leerer Elemente in der XML-Datei während der XML-Serialisierung in C# überspringen.C# XML-Serialisierung eines Arrays - "leere" String-Werte überspringen

Ex:

ArrayElements elm = new ArrayElements 
{ Items =new string[] "Item1", " ", "Item2", " ", " ", "Items" } }; 

Während der Serialisierung sollte es die leeren Saiten überspringen.

Das ist meine Klasse:

[Serializable] 
public class ArrayElements 
{ 
    [XmlElement(IsNullable=false)] 
    public string[] Items { get; set; } 
} 
+0

Fügen Sie Tags hinzu und modifizieren Sie die Frage, um die Sprache, das Framework usw. einzuschließen. Genug Informationen geben, hilft anderen helfen Ihnen. – shahkalpesh

Antwort

2

Sind Sie sicher, dass das, was Sie wollen? Ein Nachteil besteht darin, dass Sie bei der Deserialisierung nicht in der Lage sein werden, die leeren Strings zurück zu bekommen, da der Deserializer keine Möglichkeit hat, von ihnen zu erfahren. Normalerweise möchten Sie bei der Deserialisierung eine Instanz abrufen, die exakt der ursprünglichen Serialisierung ähnelt.

Wenn das ist was Sie wollen, dann müssen Sie Ihr Objekt an den Serialisierungsprozess anpassen. Wie Cheeso vorschlägt, ist eine Ersatzeigenschaft eine gute Lösung dafür.

Auch nur für die Klarheit, bin ich richtig zu sagen, Sie haben ein Objekt ArrayElements, das eine Eigenschaft Items hat, die ein Array von string s ist?

+0

Ja, ich habe ein Objekt ArrayElements, das eine Eigenschaft Items hat, die ein Array von Zeichenfolgen ist. – user146584

8

Sie können es mit einer Ersatzeigenschaft tun.

namespace Cheeso.Xml.Samples.Arrays 
{ 
    static class Extensions 
    { 
     private static XmlSerializerNamespaces _ns; 

     static Extensions() 
     { 
      // to suppress unused default namespace entries in the root elt 
      _ns = new XmlSerializerNamespaces(); 
      _ns.Add("", ""); 
     } 

     public static string SerializeToString(this XmlSerializer s, object o) 
     { 
      var builder = new System.Text.StringBuilder(); 
      var settings = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true }; 

      using (var writer = System.Xml.XmlWriter.Create(builder, settings)) 
      { 
       s.Serialize(writer, o, _ns); 
      } 
      return builder.ToString(); 
     } 
    } 

    [XmlType("ArrayOfString")] 
    public class MyContainer 
    { 
     [XmlIgnore] 
     public String[] a; 

     // surrogate property 
     [XmlElement("string")] 
     public String[] A 
     { 
      get 
      { 
       List<String> _proxy = new List<String>(); 
       foreach (var s in a) 
       { 
        if (!String.IsNullOrEmpty(s)) 
         _proxy.Add(s); 
       } 
       return _proxy.ToArray(); 
      } 
      set 
      { 
       a = value; 
      } 
     } 
    } 

    class StringArrayOnlyNonEmptyItems 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       Console.WriteLine("\nRegular Serialization of an array of strings with some empty elements:"); 
       String[] x = { "AAA", "BBB", "", "DDD", "", "FFF" }; 
       XmlSerializer s1 = new XmlSerializer(typeof(String[])); 
       string s = s1.SerializeToString(x); 
       Console.WriteLine(s); 

       Console.WriteLine("\nSerialization of an array of strings with some empty elements, via a Container:"); 
       MyContainer c = new MyContainer(); 
       c.a = x; 
       XmlSerializer s2 = new XmlSerializer(typeof(MyContainer)); 
       s = s2.SerializeToString(c); 
       Console.WriteLine(s); 
      } 
      catch (System.Exception exc1) 
      { 
       Console.WriteLine("uncaught exception:\n{0}", exc1); 
      } 
     } 
    } 
} 
Verwandte Themen