Обрабатывать нулевые значения для строки при реализации интерфейса IXmlSerializable
У меня есть следующий класс, который реализует IXmlSerializable. При реализации WriteXml () мне нужно обработать случай, когда строковые члены этого класса могут иметь нулевые значения. Каков наилучший способ справиться с этим?
В настоящее время я использую конструктор по умолчанию, в котором все свойства строки инициализируются пустыми значениями строки. Таким образом, когда вызывается WriteXml(), строка не будет нулевой.
Еще один способ сделать это - проверить с использованием String.IsNullOrEmpty перед записью каждой строки в xml.
Любые предложения о том, как я могу улучшить этот код?
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 ответ
У меня есть несколько предложений:
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
,