IXmlSerializable не десериализуется при использовании в классе

[XmlRoot("company"), DataContract(Name = "company")]
public class Company : IProvideSerialization
{
    /// <summary>
    /// Stock exchange the company is in.
    /// </summary>
    /// <see cref="https://developer.linkedin.com/documents/company-lookup-api-and-fields"/>
    /// <remarks>Available only for public companies.</remarks>
    [XmlElement("stock-exchange"), DataMember(Name = "stock-exchange", EmitDefaultValue = false, IsRequired = false), EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
    protected SerializableEnum<StockExchange> StockExchangeForXML;
    public static Company FromXml(String XML)
    {
        XmlSerializer x = new XmlSerializer(typeof(Company));
        return (Company)x.Deserialize(new StringReader(XML));
    }
}

SerializableEnum реализует IXmlSerializable.

SerializableEnum также имеет работающий FromXml; это выглядит следующим образом:

    public static SerializableEnum<T> FromXml(string XML)
    {
        XmlRootAttribute XR = (XmlRootAttribute)System.Attribute.GetCustomAttribute(typeof(T), typeof(XmlRootAttribute));
        XmlSerializer x = new XmlSerializer(typeof(SerializableEnum<T>), new XmlRootAttribute() { ElementName = XR.ElementName, IsNullable = true });
        return (SerializableEnum<T>)x.Deserialize(new StringReader(XML));
    }

Когда я делаю:

        String StockXML = "<stock-exchange><code>NMS</code><name>NASDAQ</name></stock-exchange>";
        String CompanyXML = "<company><stock-exchange><code>NMS</code><name>NASDAQ</name></stock-exchange></company>";

        SerializableEnum<StockExchange> Stock = SerializableEnum<StockExchange>.FromXml(StockXML);
        Company Cmp = Company.FromXml(CompanyXML);

Stock будет заполнен данными, но Cmp не будет заполнять данные Stock (похоже, ReadXml никогда не вызывается)...

Я пробовал добавлять в XmlSerializer дополнительные типы (например, new Type[] {typeof(SerializableEnum)}), но это не помогает.

Что мне здесь не хватает? Спасибо.

Я думаю, что это может быть что-то вроде атрибута RootElementAttribute, который мне пришлось добавить в FromXml в классе SerializableEnum. IXmlSerializable игнорировал атрибут XmlRoot, который имел перечисление, поэтому я добавил этот код, чтобы добавить его при десериализации. Есть ли другой способ заставить все это работать вместе?


person NKCSS    schedule 12.07.2012    source источник


Ответы (1)


Я предполагаю, что класс Company НЕ реализует IXmlSerializable.

Сериализация XML по умолчанию игнорирует все непубличные и только для чтения члены, поэтому она игнорирует protected StockExchangeForXML.

person alexm    schedule 12.07.2012
comment
Большое спасибо. Я пометил его как защищенный, чтобы он не отображался в intellisense и т. Д. В моем собственном проекте: - / Я забыл, что это убьет сериализацию ... Жаль, что нет правила компилятора, которое предупреждает, когда вы отметили XmlElement и т. д. на защищенных элементах . - person NKCSS; 13.07.2012