2009-08-18 28 views
6

değer verir.C# XML Serialization - Atla "boş" dizesi C#, XML seri sırasında XML dosyasında boş eleman oluşturmayı atlamak istiyorum

Ör: boş dizeleri atlaması gereken serileştirme sırasında

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

.

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

Lütfen etiketleri ekleyin ve dili, çerçeveyi vb. Içerecek biçimde değiştirin. Yeterli bilgi vermek, başkalarının size yardımcı olmasına yardımcı olur. – shahkalpesh

cevap

2

bu ne istediğiniz emin misiniz:

Bu benim sınıftır? Bir dezavantajı, sen serisini zaman deserializer onlar hakkında bilmek için hiçbir yolu yoktur, çünkü sen, boş dizeleri geri almak mümkün olmayacak olmasıdır. Eğer serisini Genellikle, tam olarak başlangıçta tefrika gibi görünen bir örneğini geri almak istiyorum. Bu ise

istediğini, o zaman seri hale getirme işlemi uyacak şekilde nesneyi çimdik var. Cheeso da anlaşılacağı gibi, bir vekil özelliği bunun için iyi bir çözümdür.

Ayrıca sadece netlik için, sana string s dizisi olan bir özellik Items, olan bir nesne ArrayElements var demek düzeltmek ben?

+0

Evet, dize dizisi olan bir özellik Ürünleri vardır bir nesne ArrayElements var. – user146584

8

Bir vekil özelliğiyle yapabilirsiniz.

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