XML 序列化和继承类型



我收到错误"{"设备1类型不是预期的。使用 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。序列化)错误:"{"设备1类型不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

我试图在设备类上编写 XmlInclude。 无济于事。如果我换行

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

要成为

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

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

必须为要在 XMLDevicesContainer 类上可用的每个子类添加 XmlIncludeAttribute。

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

按如下方式声明您的XmlSerializer

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

我以前实现的 WCF 网络服务也遇到了同样的问题。我(object obj)作为参数,我像new XmlSerializer(typeof(object))一样声明我的XmlSerializer,这是静态未知的。将其更改为new XmlSerializer(obj.GetType())解决了它。

相关内容

  • 没有找到相关文章

最新更新