IEditableObject의 구현과 유사하게 변경 사항을 제어하고 필요한 경우 변경 사항을 되돌릴 수있는 사용자 지정 컬렉션이 있습니다.
public class CollectionBO<TEntity> : Collection<TEntity> where TEntity : BOBase
{
public List<TEntity> AddedEntities { get; set; }
public List<TEntity> RemovedEntities { get; set; }
public CollectionBO()
{
AddedEntities = new List<TEntity>();
RemovedEntities = new List<TEntity>();
}
}
이 목록을 나머지 API의 DTO에서도 사용하여 쉽게 제거하거나 추가 할 레코드 정보에 액세스하고 싶지만 문제는 내부 목록 (AddedEntities, RemovedEntities)을 직렬화하지 않는다는 것입니다. 그들은 서버에 도착하고, 그 목록은 항상 비어 있으며, 질문은 목록과 심지어 그 IList 속성을 직렬화 할 수 있다는 것입니다.
await (serverUrl).AppendPathSegment(endPoit)
.WithOAuthBearerToken(token)
.PutJsonAsync(CollectionBO);
이 문제는 상속 구조와 원하는 출력 구조가 일치하지 않기 때문에 발생합니다.
에서 상속함으로써 Collection<T>
Newtonsoft는 JsonArrayContract
유형 구현으로 인해를 호출합니다 ICollection<>
. 결과적으로 직렬화를 시도 할 때 배열을 출력합니다 "[]"
..
즉, 객체 구조는 배열을 포함하는 객체입니다. serializer가 사용자 CollectionBO<TEntity>
를 객체 로 취급하도록 강제 하려면 [JsonObject]
속성을 사용하여 장식해야 합니다.
[JsonObject]
public class CollectionBO<TEntity> : System.Collections.ObjectModel.Collection<TEntity>
where TEntity : BOBase
{
public List<TEntity> AddedEntities { get; set; }
public List<TEntity> RemovedEntities { get; set; }
public CollectionBO()
{
AddedEntities = new List<TEntity>();
RemovedEntities = new List<TEntity>();
}
}
이렇게하면 serializer가 올바르게 처리 할 수 있습니다.
{"AddedEntities":[{"Id":1},{"Id":2}],"RemovedEntities":[{"Id":3},{"Id":4}],"Count":0}
주의 할 점은 Newtonsoft serializer를 사용한 동작과 같은 모든 종류의 이상한 동작을 만들 수 있으므로 컬렉션 유형을 확장하는 것은 거의 권장되지 않습니다. 또한 기본 개체가 있더라도 Count 속성은 0으로 직렬화됩니다. 확실히이 작업을 수행 할 수 있지만 컬렉션 유형을 확장 할 때 예상치 못한 동작이 계속 발생하지만 컬렉션으로 처리되지는 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다