0

エラー "{"The type Device1 was not expected. XmlInclude または SoapInclude 属性を使用して、静的に認識されていない型を指定してください。"}"

現在私は持っています:

public abstract class Device
{
   ..
} 

public class Device1 : Device
{ ... }

[Serializable()]
public class DeviceCollection : CollectionBase
{ ... }

[XmlRoot(ElementName = "Devices")]
public class XMLDevicesContainer
{
    private DeviceCollection _deviceElement = new DeviceCollection();

    /// <summary>Devices device collection xml element.</summary>
    [XmlArrayItem("Device", typeof(Device))]
    [XmlArray("Devices")]
    public DeviceCollection Devices
    {
        get
        {
            return _deviceElement;
        }
        set
        {
            _deviceElement = value;
        }
    }
}

そして私はやっています:

        XMLDevicesContainer devices = new XMLDevicesContainer();
        Device device = new Device1();

        device.DeviceName = "XXX";
        device.Password = "Password";

        devices.Devices.Add(device);
        Serializer.SaveAs<XMLDevicesContainer>(devices, @"c:\Devices.xml", new Type[] { typeof(Device1) });

シリアライザーは次のことを行います。

   public static void Serialize<T>(T obj, XmlWriter writer, Type[] extraTypes)
    {
        XmlSerializer xs = new XmlSerializer(typeof(T), extraTypes);
        xs.Serialize(writer, obj);
    }

シリアライザー メソッド (xs.Serialize) の最後の行で、"{"型 Device1 は予期されていませんでした。XmlInclude または SoapInclude 属性を使用して、静的に認識されていない型を指定してください。"}"

DeviceクラスにXmlIncludeを書いてみました。助けられませんでした。ラインを変えたら

    [XmlArrayItem("Device", typeof(Device))] 

することが

     [XmlArrayItem("Device", typeof(Device1))]

それは機能しますが、複数のデバイスタイプの配列を書きたいです。

4

2 に答える 2

4

XMLDevicesContainer クラスで使用できるようにするサブクラスごとに、XmlIncludeAttribute を追加する必要があります。

[XmlRoot(ElementName = "Devices")]
[XMLInclude(typeof(Device1))]
[XMLInclude(typeof(Device2))]
public class XMLDevicesContainer
{
:
}
于 2013-08-30T15:30:28.390 に答える
0

XmlSerializer次のように宣言します。

XmlSerializer xs = new XmlSerializer(typeof(obj), extraTypes);

以前に実装した WCF Web サービスでも同じ問題が発生しました。パラメータとしてあり、静的に知られていないlike(object obj)を宣言していました。変更することで解決しました。XmlSerializernew XmlSerializer(typeof(object))new XmlSerializer(obj.GetType())

于 2015-11-06T09:10:22.660 に答える