0
[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属性を無視したため、逆シリアル化時に追加するコードを追加しました。これをすべて一緒に機能させる別の方法はありますか?

4

1 に答える 1

2

CompanyクラスはIXmlSerializableを実装していないと思います。

デフォルトのXmlシリアル化は、すべての非公開メンバーと読み取り専用メンバーを無視するため、を無視しprotected StockExchangeForXMLます。

于 2012-07-12T16:24:25.807 に答える