C# Web API 2 XML序列化和数据契约

C# Web API 2 XML序列化和数据契约,c#,xml,serialization,asp.net-web-api2,datacontractserializer,C#,Xml,Serialization,Asp.net Web Api2,Datacontractserializer,当我的WebAPI2解决方案试图在请求XML时解析结果时,我遇到了一些错误 通过更多的研究来发现。使用默认XML序列化程序解析词典时会出现问题 基类中的属性在如下情况下解析良好: public Dictionary<string, CustomObject> MyThings{ get; set; } 而不是 IDictionary<string, object> IDictionary 我只是想知道我是否误解了如何使用DataContract、KnownType和

当我的WebAPI2解决方案试图在请求XML时解析结果时,我遇到了一些错误

通过更多的研究来发现。使用默认XML序列化程序解析词典时会出现问题

基类中的属性在如下情况下解析良好:

public Dictionary<string, CustomObject> MyThings{ get; set; }
而不是

IDictionary<string, object>
IDictionary
我只是想知道我是否误解了如何使用DataContract、KnownType和/或DataMember属性,或者这实际上仍然是使用默认XML序列化程序解析字典的限制

我在这里已经讨论了很多例子和问题,但是我没有找到一个好的解决方案

过去有人提出过这个吗?如果是这样的话,你是如何绕过限制的

我尝试过使用KeyValuePairs列表,但在这方面也失败了

谢谢

例如:

    [DataContract]
    [KnownType(typeof(Dictionary<string, Type_X>))]
    [KnownType(typeof(Dictionary<string, Type_Y>))]
    public abstract class BaseClass
    {
        [DataMember]
        public Dictionary<string, object> BaseDictionary{ get; set; }

        public BaseClass()
        {
            BaseDictionary = new Dictionary<string, object>();
        }
    }
[DataContract]
[KnownType(typeof(Dictionary))]
[KnownType(typeof(Dictionary))]
公共抽象类基类
{
[数据成员]
公共字典BaseDictionary{get;set;}
公共基类()
{
BaseDictionary=新字典();
}
}

您需要将
类型X
类型Y
声明为已知类型:

[DataContract]
[KnownType(typeof(Type_X))]
[KnownType(typeof(Type_Y))]
public abstract class BaseClass
{
    [DataMember]
    public Dictionary<string, object> BaseDictionary { get; set; }

    public BaseClass()
    {
        BaseDictionary = new Dictionary<string, object>();
    }
}

i:type
属性是允许元素断言其类型的属性。数据协定序列化程序使用它来指示正在序列化的多态类型的实际协定名称。有关详细信息,请参阅。

Ahh。。。是的,我知道它在做什么。我没有点击这是为了继承链,以便序列化程序知道尝试和序列化什么类型。我的解决方案非常相似,谢谢你给我指明了正确的方向!
[DataContract]
[KnownType(typeof(Type_X))]
[KnownType(typeof(Type_Y))]
public abstract class BaseClass
{
    [DataMember]
    public Dictionary<string, object> BaseDictionary { get; set; }

    public BaseClass()
    {
        BaseDictionary = new Dictionary<string, object>();
    }
}
<ConcreteClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Question41066771">
    <BaseDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d2p1:KeyValueOfstringanyType>
            <d2p1:Key>X</d2p1:Key>
            <d2p1:Value i:type="Type_X">
                <X>x</X>
            </d2p1:Value>
        </d2p1:KeyValueOfstringanyType>
        <d2p1:KeyValueOfstringanyType>
            <d2p1:Key>Y</d2p1:Key>
            <d2p1:Value i:type="Type_Y">
                <Y>y</Y>
            </d2p1:Value>
        </d2p1:KeyValueOfstringanyType>
    </BaseDictionary>
</ConcreteClass>
[DataContract]
public class ConcreteClass : BaseClass
{
}

[DataContract]
public class Type_X
{
    [DataMember]
    public string X { get; set; }
}

[DataContract]
public class Type_Y
{
    [DataMember]
    public string Y { get; set; }
}