2011-02-14 2 views
1

속성에 [DataContract] 속성과 적절한 [DataMember] 속성으로 꾸며진 클래스가 중첩 된 [DataContract] 클래스를 직렬화하지 않는 문제가 있습니다. 이것은 WCF 서비스를 통해 전송되는중첩 된 [DataContract]가 WCF를 통해 직렬화하지 않음

[DataContract(Namespace = "http://foo.bar.com.au")] 
[KnownType(typeof(Point))] 
[KnownType(typeof(Site))] 
public sealed class Alarm : IExtensibleDataObject 
{ 
    [DataMember] 
    public Point SourcePoint { get; set; } 
    [DataMember] 
    public Site SourceSite { get; set; } 
    [DataMember] 
    public DateTime ActiveTime { get; set; } 
    [DataMember] 
    public int Priority { get; set; } 
    [DataMember] 
    public bool IsAcknowledged { get; set; } 
    [DataMember] 
    public string Response { get; set; } 

    private ExtensionDataObject _ExtensionData; 
    public ExtensionDataObject ExtensionData 
    { 
     get { return _ExtensionData; } 
     set { _ExtensionData = value; } 
    } 
} 

는 .NET 4.0 IIS 사이트에서 호스팅되는 :

내가에는 직렬화하기 위해 노력하고있어 클래스입니다.

제 문제는 어떤 이유로 인해 SourcePointSourceSite 속성이 직렬화되지 않습니다. 그들은 null을 반환하고 있습니다. 이상하게도 ExtensionData에는이 두 클래스의 모든 필드가 포함됩니다.

다른 이상한 점은 dev 웹 서버에서 IIS 호스트를 로컬로 실행할 때 올바르게 직렬화된다는 것입니다. 두 테스트 간의 유일한 차이점은 테스트 클라이언트의 끝점이 다른 IIS 호스트를 가리키고 있다는 것입니다.

누구나 무슨 일이 일어나고 있는지 알 수 있습니까?

편집 : 추가 된 사이트 & 포인트 조각

[DataContract(Namespace = "http://foo.bar.com.au")] 
public sealed class Site : BaseObject 
{ 
    //~Site Details 
    [DataMember] 
    public string GisAssetId { get; set; } 
    [DataMember] 
    public string Catchment { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
    [DataMember] 
    public string Location { get; set; } 
    [DataMember] 
    public string MelwaysReference { get; set; } 
    [DataMember] 
    public double Latitude { get; set; } 
    [DataMember] 
    public double Longitude { get; set; } 
    ... 
} 

그리고 Point 클래스.

[DataContract(Namespace = "http://foo.bar.com.au")] 
public class Point : BaseObject 
{ 
    [DataMember] 
    public string Tag { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
    [DataMember] 
    public object CurrentValue { get; set; } 
    [DataMember] 
    public string CurrentValueFormatted { get; set; } 
    [DataMember] 
    public bool IsDigital { get; set; } 
    [DataMember] 
    public DateTime LastUpdated { get; set; } 
    [DataMember] 
    public string Source { get; set; } 
    [DataMember] 
    public bool InService { get; set; } 
    [DataMember] 
    public bool IsAlarmEnabled { get; set; } 
    [DataMember] 
    public double TrendMinimum { get; set; } 
    [DataMember] 
    public double TrendMaximum { get; set; } 
} 

BaseObject는 나머지와 동일한 DataContract 서명을 갖는 기본 클래스입니다.

+0

사이트 및 포인트는 어떤 모습입니까? 짐작할 수없는 경우 : 동일한 버전의 .NET을 실행중인 프로덕션 서버입니까? 서비스 팩 중 하나에서 계약으로 장식되지 않은 유형의 동작이 변경되었습니다 –

+0

사이트 및 포인트의 조각입니다. 사이트 및 포인트 목록을 요청하는 다른 WCF 메서드가 있고 올바르게 반환되는 것처럼 둘 다 올바르게 serialize되었는지 확인할 수 있습니다. –

+0

무시하거나 다른 것들을 가지고 있지 않으므로, 모든 Datacontract/datamember 태그를 제거하려고 시도 했습니까? 그들 중 누구도 3.5 또는 4.0에서 엄격하게 요구되지 않습니다. 그들이 없으면 클래스를 반환하는 서비스를 WCF 의미합니다. 두 개의 클래스 만 꾸며진 전체 시스템이 있습니다. 그 중 하나는 MessageContract이고 다른 하나는 IgnoreDataMembers입니다. 다른 모든 것은 독자적으로 작동합니다. :) (당신은 또한 KnownType의 알람 중 어느 쪽도 필요하지 않아야합니다.) – Tridus

답변

1

문제는 서버에 배포하는 데 사용중인 Visual Studio 웹 설치 프로젝트가 IIS 호스트의 종속성을 제대로 업데이트하지 못했기 때문입니다.

이것은 데이터 계약에 대한 변경 사항이 서버간에 복사되지 않아서 서버가 일련 성을 알지 못하여 문제가 발생 함을 의미합니다.

종속성을 올바르게 선택하기 전에 설치 프로젝트에서 프로젝트 출력을 제거하고 다시 추가해야했습니다.

이제 모든 것이 다시 작동합니다!

관련 문제