1

我在将类序列化为 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;
        }
}
4

2 回答 2

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();
}
于 2012-07-12T08:59:43.247 回答
0

由于允许使用的XmlInclude似乎模棱两可,我仍然会建议

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

作为一种可能的解决方案。很难说这如何适用于您的现实世界情况,但我希望它适用并且有效!

于 2012-07-12T09:43:32.650 回答