parse.com : SerializationException "__type"속성으로 JSON 개체 역 직렬화

제이슨 본

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'에 해당하는 형식을 추가합니다.

dbc

문제는 당신이를 사용하고 있다는 것입니다 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

동적 개체로 JSON 역 직렬화

분류에서Dev

JSON을 C # 개체로 역 직렬화

분류에서Dev

JSON 개체 역 직렬화

분류에서Dev

Json 개체를 .NET 개체로 역 직렬화

분류에서Dev

json 문자열을 .NET 개체 목록으로 역 직렬화

분류에서Dev

JSON 파일을 개체 C #으로 역 직렬화

분류에서Dev

json 문자열을 개체 C # .net으로 역 직렬화

분류에서Dev

JSON을 C # 개체 목록으로 역 직렬화

분류에서Dev

JSON 개체를 .Net 목록으로 역 직렬화 (C #)

분류에서Dev

JSON 개체를 System.Guid 형식으로 역 직렬화

분류에서Dev

Collection + JSON 객체로 역 직렬화

분류에서Dev

JSON을 .net 객체로 역 직렬화

분류에서Dev

gson 및 개조로 json 역 직렬화

분류에서Dev

단일 속성 개체의 JSON 배열을 문자열 컬렉션으로 역 직렬화

분류에서Dev

JSON 배열을 C # 개체로 역 직렬화 (TFL API)

분류에서Dev

JSON 문자열을 C # 및 Unity의 개체로 역 직렬화

분류에서Dev

JSON 응답을 특정 클래스 개체로 역 직렬화

분류에서Dev

JSON 개체를 배열로 역 직렬화

분류에서Dev

JSON 개체를 배열로 역 직렬화

분류에서Dev

VB.Net 개체로 JSON 역 직렬화

분류에서Dev

복잡한 JSON 개체 역 직렬화

분류에서Dev

JSON 개체 역 직렬화 및 작업

분류에서Dev

C #에서 JSON 개체 역 직렬화

분류에서Dev

xml 개체 C #으로 역 직렬화

분류에서Dev

JSON을 C # 개체로 역 직렬화-역 직렬화되는 데이터 없음

분류에서Dev

개체 직렬화 후 list <object> C #으로 역 직렬화

분류에서Dev

상속 된 개체 역 직렬화

분류에서Dev

콘텐츠 유형을 따라 동적 개체 JSON으로 역 직렬화-C #

분류에서Dev

JSON 목록을 C #의 개체 목록으로 역 직렬화 할 수 없음

Related 관련 기사

뜨겁다태그

보관