2010-03-30 12 views
0

J'ai la classe suivante qui implémente IXmlSerializable. Lors de l'implémentation de WriteXml(), je dois gérer le cas où les membres de la chaîne de cette classe peuvent être des valeurs nulles. Quelle est la meilleure façon de gérer cela?gérer les valeurs null pour la chaîne lors de l'implémentation de l'interface IXmlSerializable

Actuellement, j'utilise le constructeur par défaut dans lequel toutes les propriétés de chaîne sont initialisées pour les valeurs de chaînes vides. De cette façon, lorsque WriteXml() est appelée, la chaîne ne sera pas nulle.

Une autre façon que je pourrais faire est de vérifier en utilisant String.IsNullOrEmpty avant d'écrire chaque chaîne en XML.

Des suggestions pour améliorer ce code?

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

des suggestions? –

Répondre

3

J'ai quelques suggestions:

1 - seulement implémentent IXmlSerializable en dernier recours et qu'on contrôle sérialisation XML par attributs. C'est plus simple et plus facile à entretenir. Il gère également les propriétés étant une référence 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 - Ne pas envelopper le code dans un essai \ attraper si la seule chose que vous allez faire est rethrow toutes les exceptions;

3 - La ligne directrice pour les constantes dans .NET est d'utiliser PascalCase qui conduirait à DefaultClassName au lieu de DEFAULT_CLASS_NAME.