【问题标题】:handle null values for string when implementing IXmlSerializable interface实现 IXmlSerializable 接口时处理字符串的空值
【发布时间】:2010-03-30 16:35:47
【问题描述】:

我有以下实现 IXmlSerializable 的类。在实现 WriteXml() 时,我需要处理此类的字符串成员可能为空值的情况。处理此问题的最佳方法是什么?

目前,我正在使用默认构造函数,其中所有字符串属性都初始化为空字符串值。这样,当调用 WriteXml() 时,字符串不会为空。

我可以做到这一点的另一种方法是在将每个字符串写入 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
    }

【问题讨论】:

    标签: c# string null ixmlserializable


    【解决方案1】:

    我有一些建议:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2019-04-30
      • 2016-06-24
      • 1970-01-01
      相关资源
      最近更新 更多