2011-02-01 1 views
1

IDataContractSurrogate를 사용하여 DataContractSerializer를 사용하고 사용자 지정 형식 serialization을 처리하는 데 상당한 경험이 있습니다. 오늘, .NET 4.0에서 IDataContractSurrogate와 비슷하고 느슨하게 결합 된 구현을 제공하는 새로운 DataContractResolver에 대해 배웠습니다.Message.GetBody의 역 직렬화 동작에 영향을주는 방법 <T>()

내가 가지고있는 문제는 Message.GetBody() 호출에 사용되는 일부 사용자 지정/직렬화 동작을 제공해야한다는 것입니다.

문제의 메시지 페이로드에는 "개체"를 반환하는 공용 읽기/쓰기 속성이 있습니다. 인위적인 예 :

public class MessageContents 
{ 
    public int SomeValue { get; set; } 
    public object SomeData { get; set; } 
} 
... 
MessageContents entity = new MessageContents { SomeValue = 1, SomeData = new Whatever() }; 
Message entityMessage = Message.CreateMessage(
    MessageVersion.Soap12WSAddressing10, 
    String.Format("{0}Request", operation), 
    entity); 
... 
entityMessage.GetBody<MessageContents>() 

또는 getBody <>() 호출이 정상 "직렬화 복원 할 수없는 알 수없는 유형 '무엇이든'"expection가 발생합니다. DataContractSerializer를 직접 사용할 때 문제를 해결할 수 있지만 GetBody <()이 자체 DataContractSerializer를 사용하므로이 비 직렬화 동작에 어떤 영향을 미칠 수 있습니까?

메시지를 직접 처리하는 이유는 문제의 서비스 인터페이스가 많은 양의 스트리밍 데이터를 반환하고 WCF에서 메시지 유형으로 작업 계약서를 작성해야하기 때문입니다.

내가 (각 작업에 대한) 내 서비스 인터페이스에 DataContractSerializerOperationBehavior 동작을 추가하는 시도했지만, 등록 DataContractResolver는 해고하기 않습니다.

누구든지 의견이 있으십니까?

답변

2

당신은 Message.GetBody<T>(XmlObjectSerializer) 방법을 사용하고 DataContractSerializer 클래스의 제대로 구성 예를 전달할 수 :

var knownTypes = new string[] { "Whatever" }; 
var serializer = new DataContractSerializer(typeof(MessageContents), knownTypes); 

MessageContents contents = message.GetBody<MessageContents>(serializer); 

관련 리소스 :

+0

좋아요를 ... I 내 머리를 공식적으로 수치스럽게 매달아 내 괴짜를 나눠주고있어. 적어도 오늘은. 커스텀 시리얼 라이저를 사용할 수있는 과부하가 있는지보기 위해 맹세했다. 나는 실패했다. 너는하지 않았다. 감사합니다 엔리코와 고마워요 StackOverflow. –

+0

이봐 요, 당신은 문제에 대한 신선한 눈빛이 필요했습니다. 그래서 우리는 지역 사회가 있습니다 :) –