2010-03-30 7 views
0

IXmlSerializable을 구현하는 다음 클래스가 있습니다. WriteXml()을 구현할 때이 클래스의 문자열 멤버가 null 값일 수있는 경우를 처리해야합니다. 이것을 처리하는 가장 좋은 방법은 무엇입니까?IXmlSerializable 인터페이스를 구현할 때 string에 null 값을 처리합니다.

현재 모든 문자열 속성이 빈 문자열 값으로 초기화되는 기본 생성자를 사용하고 있습니다. 이렇게하면 WriteXml()이 호출 될 때 문자열이 null이되지 않습니다.

내가 할 수있는 다른 방법은 XML에서 각 문자열을 작성하기 전에 String.IsNullOrEmpty를 사용하여 검사하는 것입니다.

이 코드를 개선하는 방법에 대한 제안 사항이 있으십니까? 마지막 수단으로 만 IXmlSerializable를 구현하고 대신 속성을 통해 XML 직렬화를 제어 -

1 :

public sealed class FaxSender : IXmlSerializable 
    { 
     #region Public Constants 

     private const string DEFAULT_CLASS_NAME = "FaxSender"; 

     #endregion Public Constants 

     #region Public Properties 

     public string Name { get; set; } 

     public string Organization { get; set; } 

     public string PhoneNumber { get; set; } 

     public string FaxNumber { get; set; } 

     public string EmailAddress { get; set; } 

     #endregion Public Properties 

     #region Public Methods 

     #region Constructors 

     public FaxSender() 
     { 
      Name = String.Empty; 
      Organization = String.Empty; 
      PhoneNumber = String.Empty; 
      FaxNumber = String.Empty; 
      EmailAddress = String.Empty; 
     } 

     public FaxSender(
      string name, 
      string organization, 
      string phoneNumber, 
      string faxNumber, 
      string emailAddress) 
     { 
      Name = name; 
      Organization = organization; 
      PhoneNumber = phoneNumber; 
      FaxNumber = faxNumber; 
      EmailAddress = emailAddress; 
     } 

     #endregion Constructors 

     #region IXmlSerializable Members 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      throw new NotImplementedException(); 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      throw new NotImplementedException(); 
     } 

     public void WriteXml(System.Xml.XmlWriter xmlWriter) 
     { 
      try 
      { 
       // <sender> 
       xmlWriter.WriteStartElement("sender"); 

       // Write the name of the sender as an element. 
       xmlWriter.WriteElementString(
        "name", 
        this.Name.ToString(CultureInfo.CurrentCulture)); 

       // Write the organization of the sender as an element. 
       xmlWriter.WriteElementString(
        "organization", 
        this.Organization.ToString(CultureInfo.CurrentCulture)); 

       // Write the phone number of the sender as an element. 
       xmlWriter.WriteElementString(
        "phone_number", 
        this.PhoneNumber.ToString(CultureInfo.CurrentCulture)); 

       // Write the fax number of the sender as an element. 
       xmlWriter.WriteElementString(
        "fax_number", 
        this.FaxNumber.ToString(CultureInfo.CurrentCulture)); 

       // Write the email address of the sender as an element. 
       xmlWriter.WriteElementString(
        "email_address", 
        this.EmailAddress.ToString(CultureInfo.CurrentCulture)); 

       // </sender> 
       xmlWriter.WriteEndElement(); 

      } 
      catch 
      { 
       // Rethrow any exceptions. 
       throw; 
      } 
     } 

     #endregion IXmlSerializable Members 

     #endregion Public Methods 
    } 
+0

제안 사항이 있으십니까? –

답변

3

나는 몇 가지 제안이있다. 유지 보수가 더 쉽고 쉽습니다. 또한 null 참조가되는 속성을 처리합니다.

[XmlRoot("sender")] 
public sealed class FaxSender 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 
    [XmlElement("organization")] 
    public string Organization { get; set; } 
    [XmlElement("phone_number")] 
    public string PhoneNumber { get; set; } 
    [XmlElement("fax_number")] 
    public string FaxNumber { get; set; } 
    [XmlElement("email_address")] 
    public string EmailAddress { get; set; } 

    // Remaining code omitted 
} 

2- 당신이하려고하는 유일한 것은 다시 throw 모든 예외의 경우 시도의 \ 캐치 코드를 포장하지 마십시오

3- .NET에서 상수에 대한 가이드 라인은 DefaultClassName 대신 DEFAULT_CLASS_NAME 될 것이다 PascalCase을 사용하는 것입니다.