2009-07-27 4 views
4

나는 많은 함수와 일반적인 get과 get 메소드를 포함하여 복잡한 데이터 타입을 가지고있다. WCF를 사용할 수 있다면 내 인생이 상당히 쉬워 져서 내 클라이언트도이 데이터 형식을 사용할 수 있습니다. 복잡한 형식에 WCF DataContract를 추가 할 수 있습니까?

는 필요한 경우에만 [DataMemeber]을 가하고, 내가

  1. 모든 작업을 무시 마십시오.

  2. 클라이언트와 서버가 모두 액세스 할 수 있도록 공유 라이브러리 어셈블리에 해당 클래스를 배치하십시오.

감사 로베르토

PS. 나는 그 질문이 그것이 될 수있는만큼 잘 말한 것이 아님을 알았다.

답변

3

좋아요, 위의 모든 답변을 조합 한 것입니다.

  1. 데이터 클래스를 클라이언트 및 서버 프로젝트에서 참조되는 공유 어셈블리에 고정하십시오.
  2. "서비스 참조 구성"대화 상자에서 "참조 된 어셈블리에서 재사용"항목을 선택했는지 확인하십시오.
  3. 각 데이터 계약의 시작 부분에 [KnownType] 특성을 넣으십시오.

코드는 그래서 다음과 같습니다

위의 경우
[DataContract] 
[KnownType(typeof(WHS2SmugmugShared.Photo))] 
[KnownType(typeof(WHS2SmugmugShared.PhotoInfo))] 
public class Photo 
{ 
//code here 
} 

, 나는 사진 클래스에서 PhotoInfo를 사용합니다. PhotoInfo에는 클래스 파일에 연결된 KnownType 특성이 없습니다. 그리고 그것은 요구되는 것처럼 보이지 않습니다.

이렇게하면 복잡한 유형을 직렬화 할 수 있지만 조작은 계속 유지할 수 있습니다.

3

WCF 경계를 넘어서 전송되는 것은 모두 클래스의 상태에 해당하는 직렬화 된 것입니다. 그 방법은 없을거야. 따라서 양측에서 사용할 수있게하려면 공유 라이브러리가 필요합니다.

서비스 참조를 추가 할 때 데이터 형식을 다시 사용할 수 있습니다.이 경우 WCF는 공유 클래스로 deserialize하고 메서드로 완료합니다. 그러나 실제로 경계를 넘어 전송 된 것은 필드 값뿐입니다.

+0

"서비스 참조 구성"대화 상자에 있다고 가정합니다. 모든 참조 된 어셈블리에서 유형을 재사용하도록 설정됩니다. 이 올바른지?? –

+0

예, 그 중 하나입니다. –

0

짧은 대답 : 예. WCF는 챔피언과 같은 복잡한 유형을 처리합니다. 복잡한 유형을 전달할 때 전달되는 데이터에만 집중하고 싶습니다. 클라이언트가 DLL을 공유하지 않는 경우 클라이언트는 복합 유형의 데이터 멤버 복사본 만 가져 오기 때문에 전달되는 데이터에만 집중하는 것이 중요합니다 (추가 작업이 아닌).

자바 배경에서 온 것 같습니다. WCF를 사용하면 DataMember 특성으로 필드를 표시하거나 get/set 메서드를 속성으로 변경하는 것이 좋습니다.

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    private string bar; 

    public string GetBar() 
    { 
     return bar; 
    } 

    public void SetBar(string b) 
    { 
     bar = b; 
    } 
} 

다음과 같은 사용할 수 있습니다 : 대신 예를 들어

, 그것은 계약 수에 대한 데이터 계약에 대한

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    public string Bar { get; set; } 
} 
1

가장 좋은 방법입니다 - 어떤 행동 데이터 만 . 두 번째 모범 사례는 [DataMember]를 사용하여 클래스를 꾸미고 서버에 보관하는 것입니다. 클라이언트가 프록시 복사본을 사용하게하십시오.

0

데코레이션 serializable 특성을 사용하여 모든 유형을 장식하십시오. 따라서 WCF 서비스에 참여하는 각 복합 클래스에 대해 [DataContract] 특성을 배치 할 필요가 없습니다.

WCF 클라이언트에서 thoes 유형을 포함하는 dll을 추가하고 프록시가 해당 클래스를 재사용하지 않고 사라지게합니다. 그리고 어떤 유형이 intoproxy에 추가되면 그것을 삭제하고 dll에서 사용하십시오. 이렇게하면 복잡한 유형의 서비스를 쉽게 공유 할 수있었습니다. 그러나이 방법은 별도의 dll로 유형을 압축 할 수있는 경우에만 적용 할 수 있습니다.

관련 문제