Web API 2 솔루션이 XML 요청시 결과를 구문 분석하려고 할 때 오류가 발생했습니다.
더 많은 연구를 통해 알아보십시오. 기본 XML serializer로 구문 분석 할 때 사전에 문제가 있습니다.
기본 클래스의 속성은 다음과 같은 경우 잘 구문 분석됩니다.
public Dictionary<string, CustomObject> MyThings{ get; set; }
이것은 모든 DataContract 및 DataSerialization 특성없이 작동합니다.
그러나 동일한 작업을 수행하지만 값 유형을 '객체'로 정의하면 오류가 발생합니다.
DataContractSerializer를 사용하는 경우 DataContractResolver를 사용하거나 알려진 형식 목록에 정적으로 알려지지 않은 형식을 추가하는 경우 (예 : KnownTypeAttribute 특성을 사용하거나 serializer에 전달 된 알려진 형식 목록에 추가하는 방법) DataContractResolver를 사용하는 것이 좋습니다.
예상되는 유형으로 클래스를 장식해야하고 직렬화 기는 이론적으로 객체를 XML로 직렬화해야한다는 것을 이해 한 바에 따르면 괜찮습니다.
내가 수업을 꾸미면 같은 오류가 발생합니다.
'객체'유형을 구문 분석 할 수있는 데 여전히 제한이 있기 때문에 이것이인지 모르겠습니다. 그러나 내가 다른 사람들의 문제와 예에서 본 것에서 속성이 유형이라고 말하면 작동합니다.
object
대신에
IDictionary<string, object>
DataContract, KnownType 및 / 또는 DataMember 특성을 사용하는 방법을 오해하고 있는지 또는 이것이 실제로 기본 XML Serializer를 사용하여 사전을 구문 분석하는 데 여전히 제한 사항인지 궁금합니다.
여기에서 많은 예제와 질문을 살펴 보았지만 좋은 솔루션에 대해서는 부족합니다.
누군가 과거에 이것을 생각해 낸 적이 있습니까? 그렇다면 한계를 어떻게 극복 했습니까?
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>();
}
}
다음 Type_X
과 Type_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>();
}
}
당신이 한 일은 Dictionary<string, Type_X>
알려진 유형 으로 선언 하는 것이지만 해당 유형은 개체 그래프에서 발생하지 않습니다. 오히려 정적으로 추론 할 수 없기 때문에 사전 값으로 표시 될 실제 유형을 선언해야합니다 .
이렇게하면 데이터 계약 직렬 변환기는 다음과 같은 XML을 생성합니다.
<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; }
}
i:type
속성은입니다 W3C 표준 속성 요소가 유형을 주장 할 수 있습니다. 데이터 계약 serializer는이를 사용하여 직렬화되는 다형성 형식의 실제 계약 이름을 나타냅니다. 자세한 내용은 데이터 계약 알려진 유형을 참조하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다