C# xml序列化和继承的类型

C# xml序列化和继承的类型,c#,serialization,xmlserializer,inherited,xmlinclude,C#,Serialization,Xmlserializer,Inherited,Xmlinclude,我收到错误“{”类型Device1不是预期的。请使用XmlInclude或SoapInclude属性指定静态未知的类型。“}” 目前我有: public abstract class Device { .. } public class Device1 : Device { ... } [Serializable()] public class DeviceCollection : CollectionBase { ... } [XmlRoot(ElementName = "Dev

我收到错误“{”类型Device1不是预期的。请使用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;
        }
    }
}
将来

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

然后它就可以工作了,但我想编写多个设备类型的数组。

您必须为希望在XMLDeviceContainer类上可用的每个子类添加XmlIncludeAttribute

[XmlRoot(ElementName = "Devices")]
[XMLInclude(typeof(Device1))]
[XMLInclude(typeof(Device2))]
public class XMLDevicesContainer
{
:
}

必须为希望在XmlDeviceContainer类上可用的每个子类添加XmlIncludeAttribute

[XmlRoot(ElementName = "Devices")]
[XMLInclude(typeof(Device1))]
[XMLInclude(typeof(Device2))]
public class XMLDevicesContainer
{
:
}

声明您的
XmlSerializer
,如下所示:

XmlSerializer xs = new XmlSerializer(typeof(obj), extraTypes);
我以前实现的WCF Web服务也有同样的问题。我把
(objectobj)
作为一个参数&我在声明我的
XmlSerializer
类似于
新的XmlSerializer(typeof(object))
,它不是静态的。
将其更改为新的XmlSerializer(obj.GetType())解决了它。

声明您的
XmlSerializer
,如下所示:

XmlSerializer xs = new XmlSerializer(typeof(obj), extraTypes);
我以前实现的WCF Web服务也有同样的问题。我把
(objectobj)
作为一个参数&我在声明我的
XmlSerializer
类似于
新的XmlSerializer(typeof(object))
,它不是静态的。 将其更改为新的XmlSerializer(obj.GetType())解决了这个问题

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