2009-10-04 3 views
1

WCF에서 이러한 종류의 컬렉션을 전달하는 데 문제가 있습니까?WCF가 여러 유형의 컬렉션을 전달합니다

class Parent 
{ 
    [DataMember] 
    // some data members 

    [DataMember] 
    Child myChild;  
} 

class Child : Parent 
{ 
    [DataMember]  
    // some more data members 

    [DataMember] 
    Parent myParent; 
} 

Parent의 목록을 전달하는 데 문제가 있습니까?

이상한 결과가 나오고 때로는 채널 오류가 발생합니다. 때로는 오류가 발생하지 않지만 목록에서 모든 하위 항목을 제거하기 전까지 데이터가 제공되지 않습니다. 모든

+0

가 CollectionDataContract 내 대답을 업데이트 - 당신이 옳은 것 같다 –

답변

1

먼저, 당신은 당신이 직렬화 및 WCF 직렬화 복원해야 할 모든 클래스에 [DataContract]을 둘 필요가 - 그것은이 자동으로 상속되지 입니다!

[DataContract] 
class Parent 
{ 
    ..... 
} 

[DataContract] 
class Child : Parent 
{ 
    ..... 
} 

당신이 일의 컬렉션을 상대하고있는 경우에, 당신은 CollectionDataContract으로 확인해야 할 수 있습니다

[CollectionDataContract] 
[KnownType(typeof(Parent))] 
[KnownType(typeof(Child))] 
public class CustomCollection : List<Parent> 
{ 
} 

는 또한, WCF 및 일반적으로 SOA는 OOP와 돈과 다른 꽤 있습니다 상속을 잘 처리하지 못합니다. 다형성을 사용하고 지원하려는 곳에 서비스 계약에 [ServiceKnownTypes] 또는 [KnownType] 속성을 입력해야합니다.

그래서 당신이 Parent을 허용하는 서비스 방법을 가지고 있지만 또한뿐만 아니라 Child 인스턴스를 받아 들일 수 있어야하는 경우, 당신은 WCF에이 정보를 사용할 수 있도록 [KnownType] 속성과 메소드를 장식해야합니다.

KnownType 특성의 MSDN Documentation을 참조하거나이 항목의 SO question을 확인하십시오.

마크

나는 아래와 같이 수업에 IsReference 및 KnownType를 추가하는 것이 좋습니다
+0

을 확인해 ..하지만 , 비록 내가 모든 이상한 행동을 얻는 모든 권리 속성을 추가했습니다. 난 그게 NHibernate에 의해 개체가 생성되고, 어쩌면 문제가 어딘가에 있다는 얼굴을 포함하는 것 같아요 ... – Dani

+0

Dani, 지금 당신이 언급, 그 NHibernate를 사용하는 까지 내가 그것을 보호 setters와 클래스를 사용하여 기억, 내가 맞습니까? WCF에서 DataContract 특성으로 표시된 모든 속성에 공용 getter 및 setter가있는 것을 요구하는 반면 –

+1

안녕하십니까, WCF는 NH 속성 인 과 잘 맞습니다. 아직 조사 중에 문제의 원인을 typeofof (father)에서 개체를 가져 오면 뉴 햄프셔가 모든 아버지와 아들을 돌려 주었고 (기대했던대로 ...) WCF는 그것을 처리 할 수 ​​없었습니다. b/c 형식의 부모 개체 (내부에 자식 개체를 포함하고 있었지만 문제가 없었 음) 배열의 부모 및 자식 모두 채널에 오류가 반환되었습니다. 이제 "Father"개체 만 가져 오도록 쿼리를 변경할 수 있는지 확인하면 문제가 해결됩니다. – Dani

0

:

[DataContract(IsReference = true)] 
[KnownType(typeof(Child))] 
class Parent 
{ 
    [DataMember] 
    some data members 

    [DataMember] 
    Child myChild; 
} 

[DataContract(IsReference = true)] 
class Child : Parent 
{ 
    [DataMember] 
    some more data members 

    [DataMember] 
    Parent myParent; 
} 
+0

시도해 보았지만 상속을 도용했지만 여전히 작동하지 않습니다. (이제 아버지는 그 자식의 IList 만 있지만 자식 개체는 아버지를 상속하지 않습니다 (둘 다 기본 클래스를 상속합니다) – Dani

+0

For WCF를 통해 작동하는 일반 개체 컬렉션은 다음에서 볼 수 있습니다. http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html –

관련 문제