簡體   English   中英

在實現IXmlSerializable接口時處理字符串的空值

[英]handle null values for string when implementing IXmlSerializable interface

我有以下實現IXmlSerializable的類。 在實現WriteXml()時,我需要處理此類的字符串成員可能為空值的情況。 處理此問題的最佳方法是什么?

當前,我正在使用默認構造函數,其中所有字符串屬性都初始化為空字符串值。 這樣,當調用WriteXml()時,字符串將不會為null。

我可以執行的另一種方法是在將每個字符串寫入xml之前使用String.IsNullOrEmpty進行檢查。

關於如何改進此代碼的任何建議?

    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
    }

我有一些建議:

1-僅將IXmlSerializable實現為最后手段,而是通過屬性控制XML序列化。 它更容易維護。 它還處理作為空引用的屬性。

[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-如果您唯一要做的就是重新拋出每個異常,請不要在try \\ catch中包裝代碼;

3 -在.NET常數的原則是使用PascalCase這將導致DefaultClassName而不是DEFAULT_CLASS_NAME

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM