2012-05-09 2 views
3

Json.Net에는 하위 클래스의 재정의 된 속성을 직렬화하는 데 문제가 없습니다.Json.Net에서 new로 선언 된 상속 된 속성을 직렬화하지 않습니다.

public override ICollection<Person> Persons { get; set; } 

하지만 재산에 new를 사용하려고하면, 직렬화가 실패합니다. 예외는 없습니다. Persons은 결코 직렬화되지 않습니다.

public new ICollection<Person> Persons { get; set; } 

왜 그렇습니까?

는 (이 예는 내가 아는 많은 이해가되지 않습니다. 그것은 단지 예입니다. 목표는 나중에 재산 public new ICollection<PersonDto> Persons { get; set; }의 데이터 유형을 변경 할 수 있습니다)

+0

정의 된 속성은 어떤 클래스입니까? 그리고 어떤 클래스에서 같은 이름을 가진'new' 속성을 정의합니까? 그리고 어떤 수업을 직렬화합니까? 속성을'new'로 정의하면 기본 클래스로 직렬화 할 수 없습니다. 기본 클래스의'Persons' 속성은 초기화되지 않았거나 null이거나 빈 콜렉션 인 반면 (코드 나머지 부분에 따라 다름) 파생 클래스의'Persons' 속성은 기본 클래스의 일부로 표시되지 않으므로 직렬화되지 않습니다. – CodeCaster

+0

왜이 작업을 수행하려고합니까? 'Person'을위한 커스텀 컨버터를 사용하지 않는 것이 더 합리적일까요? – svick

+0

@svick 나는 사용자 지정 변환기가 무엇인지 알지 못합니다. 내게 가르쳐주세요! – FatAlbert

답변

2

내가 해결 여기에 간단한 방법을 발견을 JsonConverter

하는 경우 작동하는 속성 위에 속성 JsonProperty을 넣습니다.

[JsonProperty] 
public new ICollection<PersonDto> Persons { get; set; } 

왜 Json.Net에는 여기에 속성이 필요한지 알 수 없습니다. 일반적으로 JsonIgnore으로 꾸며지지 않은 모든 항목을 직렬화합니다. 누군가 아는 경우 환영받을 수 있습니다.

1

당신은 당신이 원하기 때문에이 작업을 수행하려면 정확히 Person이 JSON에 직렬화되도록 지정하려면 사용자 정의 JsonConverter을 사용하는 것이 더 나은 해결책이라고 생각합니다.

class PersonConverter : JsonConverter 
{ 
    public override void WriteJson(
     JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var person = (Person)value; 
     serializer.Serialize(
      writer, 
      new 
      { 
       Name = person.LastName, 
       Age = (int)(DateTime.Now - person.BirthDate).TotalDays/365 
      }); 
    } 

    public override object ReadJson(
     JsonReader reader, Type objectType, object existingValue, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Person); 
    } 
} 

당신은 다음과 같이 사용할 수 있습니다 : 컨버터는 다음과 같이 볼 수있는 사용자 정의를 만들 필요없이

JsonConvert.SerializeObject(yourObject, new PersonConverter()) 
관련 문제