2009-08-18 5 views
6

C#의 xml 직렬화 중에 XML 파일의 빈 요소 만들기를 건너 뛰고 싶습니다.배열의 C# XML 직렬화 - "빈"문자열 값 건너 뛰기

예 :이 빈 문자열을 건너 뛰어야 직렬화하는 동안

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

.

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

태그를 추가하고 언어, 프레임 워크 등을 포함하도록 질문을 수정하십시오. 충분한 정보를 제공하면 다른 도움이됩니다. – shahkalpesh

답변

2

당신이 원하는 무엇을 확실 :

이 내 클래스? 한 가지 단점은 비 직렬화 할 때 비어있는 문자열을 얻을 수 없다는 것입니다. 비 직렬기가 비어있는 문자열을 알 수있는 방법이 없기 때문입니다. 일반적으로 역 직렬화 할 때 원래 직렬화 한 인스턴스와 똑같은 인스턴스를 되돌리고 싶습니다.

인 경우 직렬화 프로세스에 맞게 개체를 조정해야합니다. Cheeso가 시사 하듯이, 대리 재산이 이것을위한 좋은 해결책입니다.

또한 명확하게하기 위해 이라는 개체가 Itemsstring s 인 개체가 있다고 말하고 싶습니다.

+0

예, 문자열 배열 인 Items 항목이있는 ArrayElements 개체가 있습니다. – user146584

8

대리 속성을 사용하여이 작업을 수행 할 수 있습니다.

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