2010-02-11 5 views
4

당신의 도움을 요청하고 싶습니다. 여기에 Enum 형식이 키로 사용되는 Dictionary의 WCF deserialization 문제가 있습니다.열거 형이 키가되는 사전의 WCF 비 직렬화

나는 두 개의 데이터 개체가 :

[DataContract] 
public enum MyEnum : int 
{ 
    [EnumMember] 
    Value1 = 0, 
    [EnumMember] 
    Value2 = 1 
} 

ReturnData 클래스는 더 많은 데이터 구성원을 포함하지만, 내 예를 들어 중요하지 않은 사실

[DataContract] 
[KnownType(typeof(MyEnum))] 
public class ReturnData 
{ 
    [DataMember] 
    public IDictionary<Enum, string> codes; 
} 

.

객체 메소드에 의해 반환되는 이러한 데이터

:

[OperationContract] 
public ReturnData Method1() 
{ 
ReturnData data = new ReturnData(); 
data.codes = new Dictionary<Enum, string>(); 
data.codes.Add(MyEnum.Value1, "stringA"); 

return data; 
} 

내가 다음 예외가 발생 클라이언트 측에서 방법 항목을 호출 할 때 : 메시지를 역 직렬화하는 동안 포맷터는 예외가 발생했습니다

: 매개 변수 http://tempuri.org/:Method1Result을 비 직렬화하는 동안 오류가 발생했습니다. InnerException 메시지는 '라인 1 위치 522 오류입니다.' http://schemas.microsoft.com/2003/10/Serialization/Arrays:Key '요소에' http://schemas.datacontract.org/2004/07/AMService:MyEnum '데이터 계약의 데이터가 포함되어 있습니다. 디시리얼라이저는이 계약에 매핑되는 모든 유형에 대해 알지 못합니다. 'MyEnum'에 해당하는 형식을 알려진 형식 목록에 추가합니다. 예를 들어 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가합니다.

어떤 아이디어가이 문제를 해결하기 위해 ReturnData 클래스를 정의합니까?

참고 : 나는 키 데이터 유형 MyEnum 대신 Enumpublic IDictionary<MyEnum, string> codes; 다음 직렬화가 제대로 작동하고 데이터가 문제없이 클라이언트 측에 서버 측에서 전송로 사용 ReturnData 회원 codes을 변경하는 경우.

도움 주셔서 감사합니다.

+2

안녕 제이슨이 될! 이 문제에 대한 해답을 얻었습니까? 목록과 사전에 관련된 문제가 있습니다. – Nayan

답변

2

클래스 상단에 KnownType 속성을 추가하십시오.

using System.Runtime.Serialization; 

[KnownType(typeof(MyEnum))] 
[DataContract] 
public class Foo { 

} 
+0

당신의 대답에 대해 kaze waza 감사합니다. 그러나 만약 당신이 내 클래스 ReturnData를 다시 확인한다면 당신은 'KnownType'속성이 이미 있음을 볼 수 있습니다 ... –

+0

예, 제가 제 대답을 한 후에 그것을 추가 했습니까? :) 서버의 KnownType 특성을 사용하여 클라이언트 프록시를 재생성 해 보셨습니까? –

0

should'nt이 줄

data.codes = new Dictionary<Enum, string>(); 

data.codes = new Dictionary<MyEnum, string>(); 
+0

No. 컴파일 할 수 없습니다. IDictionary codes = new Dictionary (); –

+0

IDictionary 코드 = 새 사전 (); – Neil

+0

예입니다. 내 원래 게시물의 노트 섹션에 기록됩니다. 하지만 질문은 serializable IDictionary 데이터 멤버를 만드는 방법입니다. –