2014-04-21 1 views
1

정확히 하나 개의 요소로 컬렉션을 역 직렬화 할 수 없습니다 :대중 교통 나는이 같은 대중 교통 메시지 인터페이스를 가지고

public interface IPerson 
{ 
    ICollection<PersonalName> Names { get; } 
} 

public class PersonalName 
{ 
    public string FamilyName { get; set; } 
    public string GivenName { get; set; } 
    public string SecondName { get; set; } 
    public string Use { get; set; } 
} 

그리고 이것은 JsonMessageSerializer를 사용하여 메시지를 직렬화 및 역 직렬화 작동합니다. 나는 또한 XmlMessageSerializer를 사용하여 메시지를 직렬화 할 수 있으며, 결과는 조금 다음과 같습니다

<person> 
    <names> 
     <familyName>Simpson</familyName> 
     <givenName>Homer</givenName> 
     <secondName>Jay</secondName> 
     <use>Official</use> 
    </names> 
    <names> 
     <givenName>Homie</givenName> 
     <use>Nickname</use> 
    </names> 
</person> 

를 내가 역 직렬화 할 수 있습니다 그냥 컬렉션이 비어있는 경우 또는 둘 이상의 요소가있는 경우. 컬렉션이 정확히 하나 개의 요소가있는 경우에 나는 직렬화에 갈 때 그러나,이 오류가 발생합니다 :

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type ' System.Collections.Generic.ICollection`1[MyNs.PersonalName] ' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

Path 'person.names.familyName'.

나는 배열이나 List<T>를 사용하여이 문제를 해결할 수 있습니다,하지만 난 정말 않도록하고 싶습니다 그렇게 해. 대중 교통의 XmlMessageSerializerICollection<T> 유형을 역 직렬화 할 수있는 방법이 있습니까? Mass Transit은 (XML의 경우조차도) 직렬 연결에 Json.NET을 사용하기 때문에 형식에 주석을 달아 어떤 방식 으로든 ICollection<T>을 사용할 수 있기를 바랍니다. 대신 역 직렬화하기 위해 노력

+0

대신'ICollection에 '의 '허용'IList의인가 :

{"FamilyName":"Smith","GivenName":"John"} 

당신이 역 직렬화하는 배열에 통과해야? 그렇지 않다면 GitHub (https://github.com/MassTransit/MassTransit)에서 문제를 열면 아마 그 일을 할 수있을 것입니다. – Travis

+0

그리고'ICollection '은'IList '에 의해 구현 되었기 때문에 올바른 시리얼 라이저를'ICollection '에 바인딩 할 가능성이 높습니다. – Travis

+0

@Travis 나는이 컬렉션을 의미 적으로 식별 할 메시지 라이브러리를 개발 중입니다.이 라이브러리는 순서 또는 고유성이 중요하지 않은 '가방'으로 식별됩니다. 라이브러리의 다른 부분에서는 순서가 중요하며 IList를 사용하고 고유성이 중요한 곳에서는 ISet을 사용합니다. 그래서 나는 'IList'를 사용할 수는 있지만, 적절하지 않은 IList에 내재 된 의미를 채택하는 것을 의미합니다. 나는 그것이 의미가 있기를 바랍니다. –

답변

0

:

[{"FamilyName":"Smith","GivenName":"John"}] 
+0

Mass Transit은 Json.NET을 사용하여 XML 직렬화를 수행합니다. 예를 들어 업데이트를 참조하십시오. –

관련 문제