2012-10-17 4 views
1

WCF 서비스 (Net TCP 바인딩)를 통해 보내려는 CLR 클래스가 있습니다. 클라이언트와 서버 모두 동일한 데이터 클래스와 서비스 인터페이스를 사용합니다. 생성 된 스텁이 없습니다. I는 (/**/로 표시)의 BindingList[DataMember] 특성 omitt 경우BindingList <T> as DataMember

[DataContract] 
public class ContainerClass 
{ 
    //some primitive data with [DataMember] ... 

    [DataMember] /**/ 
    public virtual BindingList<ItemClass> Items{ get; private set; } 
} 

[DataContract] 
public class ItemClass 
{ 
    //some primitive data with [DataMember] ... 

    public ContainerClass Parent { get; set; } // (no [DataMember]) 
} 

데이터가 정확하게 전송된다 : 여기서 두 종류의 기본 부품이다. 물론, 항목없이.

마자 나는 [DataMember], ContainerClass 다음과 같은 오류 메시지와 함께 실패 유형의 개체 반환하는 서비스 메서드 호출, 추가로 :

서버는 의미있는 답변을 제공하지 않았다을; 이는 계약 불일치, 조기 세션 종료 또는 내부 서버 오류로 인해 발생할 수 있습니다.

의도적으로 계약 불일치가 불가능합니다. 내부 서버 오류가있을 수 있으며이를 통보받지 못했습니다.

이 문제를 해결하고 서버가 클라이언트에 항목을 보내도록하려면 어떻게해야합니까?

답변

1

대부분 BindingList<>은 직렬화에 실패합니다. 보다 자세한 오류를 얻으려면 추적을 사용해야합니다. 방법은 this post을 참조하십시오.

DTO에서 복잡한 컬렉션 클래스를 사용하는 것은 좋지 않습니다. 대신 배열/목록을 고려해보십시오. 클라이언트 측에서 항상 BindingList<>을 재구성 할 수 있습니다.

+0

당신 말이 맞아요. BindingLists를 사용하여 몇 가지 긍정적 인 테스트를 수행했지만. –

+0

방금 ​​다른 이유를 발견했습니다. 필자가'[Serializable] '로 표시 한 기본 클래스는 INOTifyPropertyChanged 인터페이스 및 해당 이벤트를 구현했습니다. 그것은'[DataContract]'가 아니기 때문에, serializer는 실패한 이벤트를 포함한 모든 멤버를 직렬화하려고 시도했습니다. 나는'[DataContract]'속성을 추가했는데 제대로 작동했다. –

관련 문제