Windows 10 UWP 앱을 개발 중이며 "mscorlib.ni.dll에서 'System.Runtime.Serialization.SerializationException'유형의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다."라는 오류를 제거 할 수없는 것 같습니다.
Rest API를 사용하여 Parse의 데이터 저장소에서 값을 검색하고 개체를 인스턴스화하고 있습니다. 내 수업은 다음과 같습니다.
public class ImageTest
{
public class Image
{
public string __type { get; set; }
public string name { get; set; }
public string url { get; set; }
}
public class Result
{
public string createdAt { get; set; }
public Image image { get; set; }
public string name { get; set; }
public string objectId { get; set; }
public string updatedAt { get; set; }
}
public class RootObject
{
public List<Result> results { get; set; }
}
}
내 JSON 출력은 다음과 같습니다.
{
"results": [
{
"createdAt": "2015-11-16T02:04:17.403Z",
"image": {
"__type": "File",
"name": "stark.jpg",
"url": "http://xyz.parse.com/stark.jpg"
},
"name": "Stark",
"objectId": "2ypGrvkvg0",
"updatedAt": "2015-11-16T02:04:23.121Z"
},
{
"createdAt": "2015-11-16T02:04:31.409Z",
"image": {
"__type": "File",
"name": "targaryen.jpg",
"url": "http://xyz.parse.com/targaryen.jpg"
},
"name": "Targaryen",
"objectId": "otgO3scX3k",
"updatedAt": "2015-11-16T02:04:40.094Z"
}
]
}
오류 메시지의 세부 사항은 다음과 같습니다. 추가 정보 : ': image'요소에는 ': File'데이터 계약의 데이터가 포함됩니다. deserializer는이 계약에 매핑되는 유형에 대한 지식이 없습니다. 예를 들어 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가하여 알려진 형식 목록에 'File'에 해당하는 형식을 추가합니다.
문제는 당신이를 사용하고 있다는 것입니다 DataContractJsonSerializer
귀하의 JSON 직렬화하고, "__type"
A는 예약 된 특성 이 직렬화합니다. 파생 된 유형의 다형성 유형을 식별하는 데 사용됩니다. 로부터 문서 :
유형 정보 보존
형식 ID를 유지하기 위해 복잡한 형식을 JSON으로 직렬화 할 때 "형식 힌트"를 추가 할 수 있으며 deserializer는 힌트를 인식하고 적절하게 작동합니다. "유형 힌트"는 키 이름이 "__type"인 JSON 키 / 값 쌍입니다 (두 개의 밑줄과 "유형"단어). 값은 "DataContractName : DataContractNamespace"형식의 JSON 문자열입니다 (첫 번째 콜론까지의 모든 것이 이름 임) ...
유형 힌트는 XML Schema Instance 표준에 정의 된 xsi : type 속성과 매우 유사하며 XML을 직렬화 / 역 직렬화 할 때 사용됩니다.
"__type"이라는 데이터 멤버는 유형 힌트와의 잠재적 충돌로 인해 금지됩니다.
따라서이 속성을 클래스에 수동으로 추가하고 올바르게 번역 할 수 없습니다 .
그러나 직렬화 기의 다형성 처리를 활용 하여 유형이 예상 유형의 하위 클래스 인 이미지 정보의 클래스 계층 구조를 정의 하여 "__type"
자동으로 를 읽고 쓸 수 있습니다 Image
. FileImage
명확성 을 위해 이름을로 변경하겠습니다 .
public class ImageTest
{
[DataContract(Namespace = "")]
[KnownType(typeof(FileImage))]
public abstract class ImageBase
{
}
[DataContract(Name = "File", Namespace = "")]
public sealed class FileImage : ImageBase
{
[DataMember(Name = "name")]
public string name { get; set; }
[DataMember(Name = "url")]
public string url { get; set; }
}
[DataContract(Namespace = "")]
public class Result
{
[DataMember]
public string createdAt { get; set; }
[IgnoreDataMember]
public FileImage image { get { return imageBase as FileImage; } set { imageBase = value; } }
[DataMember(Name = "image")] // Need not be public if DataMember is applied.
ImageBase imageBase { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public string objectId { get; set; }
[DataMember]
public string updatedAt { get; set; }
}
public class RootObject
{
public List<Result> results { get; set; }
}
}
이제 모든 것이 작동합니다.
나중에 서버가 추가 "__type"
값 및 속성 데이터 (예 : 포함 된 Base64 이미지) 와 함께 JSON 데이터를 보내는 것을 발견 하면 이제 데이터 모델을 쉽게 수정하여 추가 하위 클래스를에 추가 할 수 있습니다 ImageBase
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다