2009-08-18 12 views
6

Chcę pominąć tworzenie pustych elementów w pliku XML podczas szeregowania xml w języku C#.C# XML Serializacja tablicy - Pomiń "puste" wartości ciągów znaków

Ex:

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

Podczas serializacji należy pominąć pustych strun.

To moja klasa:

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

Dodaj tagi i zmień pytanie tak, aby zawierał język, ramy itp. Przekazywanie wystarczającej ilości informacji, pomaga w innej pomocy. – shahkalpesh

Odpowiedz

2

Czy jesteś pewien, że to, co chcesz? Jedną wadą jest to, że gdy deserializujesz, nie będziesz w stanie odzyskać pustych łańcuchów, ponieważ nie ma sposobu, aby deserializator wiedział o nich. Zwykle, gdy deserializujesz, chcesz odzyskać instancję, która wygląda dokładnie tak, jak oryginalnie serializowana.

Jeśli chcesz, aby był, musisz dostosować swój obiekt, aby dopasować go do procesu serializacji. Jak sugeruje Cheeso, własność zastępcza jest dobrym rozwiązaniem.

Również tylko dla jasności, mam rację powiedzieć masz obiekt ArrayElements, który ma właściwość Items, która jest tablicą string s?

+0

Tak, mam obiekt ArrayElements, który ma właściwość Items, która jest tablicą ciągów. – user146584

8

Możesz to zrobić przy użyciu surogatu zastępczego.

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); 
      } 
     } 
    } 
} 
Powiązane problemy