2013-07-11 2 views
0

wcf를 사용하는 프로젝트가 있습니다. 현재 NetDataContractSerializer를 사용합니다. protobuf-net으로 마이그레이션하고 싶습니다. 내 서비스는 folowing 계약을 맺고 :OperationContract에 객체가있는 wcf serializer로 protobuf-net

interface IRemotingServer 
{ 
    [OperationContract] 
    TypeConfig GetTypeConfig(string typename); 

    [OperationContract] 
    object ExecuteMethod(InstanceIdentifier instance, string methodName, object[] parameters); 

    [OperationContract] 
    object ExecuteGenericMethod(InstanceIdentifier instance, string methodName, object[] parameters, string[] genericTypes, string returnType); 

    [OperationContract] 
    object GetRemoteProperty(InstanceIdentifier instance, string propertyName); 

    [OperationContract] 
    void SetRemoteProperty(InstanceIdentifier instance, string propertyName, object value);  

    [OperationContract] 
    ObjectDataPacket GetObject(InstanceIdentifier instance); 

    [OperationContract] 
    bool Connect(); 

    [OperationContract] 
    bool Disconnect(); 
} 

일이 잘 간다, 내가 객체 유형입니다 반환 내 계약의 GetRemoteProperty 메소드를 호출하려고 할 때까지. 내가 발견 서버 추적을 사용하여 해당 서버는 매개 변수 http://www.mersoft.am/Remoting:GetRemotePropertyResult를 직렬화하는 동안 오류가 발생했습니다

메시지 folowing와 불면. InnerException 메시지가 'Type'입니다. 데이터 계약 이름이 'ArrayOfInstanceIdentifier : Mersoft.Remoting'인 Mersoft.Remoting.InstanceIdentifier [] '이 (가) 필요하지 않습니다. DataContractResolver를 사용하거나 알려진 유형 목록에 정적으로 알려지지 않은 유형을 추가하십시오 (예 : KnownTypeAttribute 속성을 사용하거나 DataContractSerializer에 전달 된 알려진 유형 목록에 추가). 자세한 내용은 InnerException을 참조하십시오.

그럼 어떻게 해결할 수 있습니까?

답변

0

기본적으로 object을 반환하면 BinaryFormatter 또는 NetDataContractSerializer이 아닌 모든 serializer에서 큰 문제가됩니다. object으로 반환하면이 작동하지 않고 은 일반 용도의 WCF 경계에서으로 부적합합니다. protobuf-net은 대부분의 시리얼 라이저 (DataContractSerializer, XmlSerializer, JSON.NET 등)와 마찬가지로 단지 object 이상을 알고 싶어합니다. 간단히 말해서, 이 아니며 대부분의 시나리오에서 역 직렬화하기에 충분한 정보는이 아닙니다.

object을 반환하는 경우 protobuf-net (또는 대부분의 serializer)에서 제대로 작동하지 않습니다. 현재 ProtoOperationBehaviorDataContractSerializerOperationBehavior에서 상속됩니다. 한 가지 가능한 옵션은 DataContractSerializer 대신 NetDataContractSerializer이 기본값 인 버전을 작성하는 것입니다. 이는 알려지지 않은 유형이 NetDataContractSerializer에 의해 대신 직렬화된다는 것을 의미합니다. 물론 object, 은 여전히 ​​protobuf-net을 사용하지 않으므로이 될 수 없습니다.

+0

@Gor 짧은 대답 : 아니오; 그래서 나는 그것을 언급하지 않았다; p –