【问题标题】:IXmlSerializable doesn't get deserialized when used in classIXmlSerializable 在类中使用时不会反序列化
【发布时间】:2012-07-12 09:56:59
【问题描述】:
[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)}),但这没有帮助。

我在这里缺少什么?谢谢。

我认为它可能类似于我必须在 SerializableEnum 类的 FromXml 中添加的 RootElementAttribute。 IXmlSerializable 忽略了枚举具有的 XmlRoot 属性,因此我添加了该代码以在反序列化时添加它。有没有其他方法可以让这一切一起工作?

【问题讨论】:

    标签: c# xml serialization xml-serialization ixmlserializable


    【解决方案1】:

    我认为 Company 类确实没有实现 IXmlSerializable。

    默认 Xml 序列化忽略所有非公共和只读成员,因此它忽略 protected StockExchangeForXML

    【讨论】:

    • 非常感谢。我将它标记为受保护,使其不会出现在我自己的项目中的智能感知等中:-/我忘记了这会杀死序列化......太糟糕了,当您在受保护的项目上标记 XmlElement 等时,没有编译器规则会发出警告.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多