Xml序列化异常:不期望UserQuery + SpecificContentItem类型。使用XmlInclude或SoapInclude

时间:2012-07-12 08:50:52

标签: c# .net xml-serialization

我在将类序列化为XML时遇到了问题。我创建了一个示例代码,运行显示错误。我要序列化的类名为“ContentContainer”,ContentContainer有一个项目集合,其类型为“ContentItemBase”。因为我的要求我实现了这些类如下。但是当代码到达部件时,如果实际的序列化调用,序列化程序会抛出此异常:

  

不期望UserQuery + SpecificContentItem类型。使用   XmlInclude或SoapInclude属性指定不是的类型   静态地知道。

我已经搜索过这个问题但是我的要求我无法实现异常消息中提到的XmlInclude方法。 这个问题和类似的问题是否有任何解决方案(设计或实施提示)?

代码:

void Main()
{
    var item  = new SpecificContentItem{ Name = "Test", Value = "TestValue" , SpecificField="TestField"};
    var container = new ContentContainer();
    container.Items.Add(item);
    container.Name = "Test Container";
    XmlSerializer ser=  new XmlSerializer(typeof(ContentContainer));
    StringWriter writer = new StringWriter();
    ser.Serialize(writer, container);
    string result = writer.ToString();
}
public abstract class ContentItemBase
{
    public abstract string Name {get; set;}
    public abstract string Value {get; set;}
}

public class SpecificContentItem: ContentItemBase
{
    public string SpecificField {get; set;}
    public override string Name {get; set;}
    public override string Value {get; set;}
}
public class ContentContainer
{
    public ContentContainer()
    {
        Items = new ContentItemCollection();
    }
    public string Name {get;set;}
    public ContentItemCollection Items{get; set;}
}

public class ContentItemCollection : IEnumerable<ContentItemBase>
{
        public SpecificContentItem SpecificItem { get; set; }
        public IEnumerator<ContentItemBase> GetEnumerator()
        {
            if (SpecificItem != null)
                yield return SpecificItem;
        }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        public void Add(Object obj)
        {
            if (obj is SpecificContentItem)
                SpecificItem = (SpecificContentItem)obj;
        }
}

2 个答案:

答案 0 :(得分:1)

将序列化器创建为:

XmlSerializer ser = new XmlSerializer(typeof(ContentContainer), 
                            new Type[] { typeof(SpecificContentItem) });

应该这样做。

您还可以向Serialize

添加ContentContainer方法
public string Serialize()
{
    var types = Items.Select(x => x.GetType()).Distinct().ToArray();
    XmlSerializer ser = new XmlSerializer(typeof(ContentContainer),types);
    StringWriter writer = new StringWriter();
    ser.Serialize(writer, this);
    return writer.ToString();
}

答案 1 :(得分:0)

由于允许使用XmlInclude似乎含糊不清,我仍然会建议

[XmlInclude(typeof(SpecificContentItem))]
public class ContentItemCollection : IEnumerable<ContentItemBase>
{

作为可能的解决方案。这对你的现实世界情况如何适用有点难以辨别,但我希望它适用并且有效!