Создать полную структуру XML из класса - проблема: элементы с нулевыми значениями пропускаются (все строковые типы) - PullRequest
0 голосов
/ 09 мая 2011

У меня проблема:)

У меня есть XML, скажем:

<?xml version="1.0" encoding="utf-16"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SMTPserver port="25" user="aa" password="123" senderAddress="aa@aa.com">127.0.0.1</SMTPserver>
</Configuration>

У меня есть класс сериализации (обратите внимание, здесь показана только часть кода):

....
   /// <summary>
    /// SMTP server settings.
    /// </summary>
    [Serializable()]
    public class SMTPserver
    {
        /// <summary>
        /// Gets or sets the SMTP port.
        /// </summary>
        /// <value>
        /// The SMTP port.
        /// </value>
        [XmlAttribute("port")]
        public int Port
        { get; set; }

        /// <summary>
        /// Gets or sets the user if SMTP needs authentication.
        /// </summary>
        /// <value>
        /// The SMTP user.
        /// </value>
        [XmlAttribute("user")]
        public string User
        { get; set; }

        /// <summary>
        /// Gets or sets the password if SMTP needs authentication.
        /// </summary>
        /// <value>
        /// The SMTP user password.
        /// </value>
        [XmlAttribute("password")]
        public string Password
        { get; set; }

        /// <summary>
        /// Gets or sets the sender address. Email address which wil be set as Sender of the all emails.
        /// </summary>
        /// <value>
        /// The sender address.
        /// </value>
        [XmlAttribute("senderAddress")]
        public string SenderAddress
        { get; set; }

        /// <summary>
        /// Gets or sets the name of the SMTP server or IP address.
        /// </summary>
        /// <value>
        /// The name of the SMTP server or his IP address.
        /// </value>
        [XmlText]
        public string SMTPServerAddressOrName
        { get; set; }
    }
...

У меня есть методы сериализации / десериализации. Для сериализации я использую этот метод:

/// <summary>
/// Serializes the specified data into XML string.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data">The data.</param>
/// <returns>XML string</returns>
public static string Serialize<T>(T data)
{
    string xmlText = String.Empty;

    using (StringWriter XMLText = new StringWriter())
    {
        XmlSerializer xSerializer = new XmlSerializer(typeof(T));
        xSerializer.Serialize(XMLText, data);
        xmlText = XMLText.ToString();
    }

    return xmlText;
}

Обычно все работает нормально. Но я хотел бы создать из своего класса пустую (без данных) полную структуру XML (чтобы использовать ее в качестве примера для пользователя, какие записи можно использовать).

Я пытался:

// Configuration is my Serialization class.
//    [Serializable()]
//    [XmlRoot()]
        Configuration cleanConfig = new Configuration();
        string generatedXml = SettingsManager.Serialize<Configuration>(cleanConfig);

И результат:

<?xml version="1.0" encoding="utf-16"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SMTPserver port="0"/>
</Configuration>

вместо

<SMTPserver port="0" user="" password="" senderAddress=""/>

Все свойства моего "пустого" класса конфигурации, которому присвоено значение NULL (это было сделано автоматически, поскольку это строка), были пропущены.

У меня есть больше элементов с типом String, и все они (с нулевым значением) были пропущены в сгенерированном XML. Обычно это нормально и хорошо, но в этом случае я хотел бы просто сгенерировать полный пример «XML-структуры», который будет правильным для моего приложения.

1 Ответ

0 голосов
/ 09 мая 2011

Попробуйте использовать решение, предлагаемое в этом разделе: Сериализация Xml - визуализация пустого элемента

Должно быть, уловка.

...