속성에 [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 사이트에서 호스팅되는 :
이
내가에는 직렬화하기 위해 노력하고있어 클래스입니다.제 문제는 어떤 이유로 인해 SourcePoint
및 SourceSite
속성이 직렬화되지 않습니다. 그들은 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 서명을 갖는 기본 클래스입니다.
사이트 및 포인트는 어떤 모습입니까? 짐작할 수없는 경우 : 동일한 버전의 .NET을 실행중인 프로덕션 서버입니까? 서비스 팩 중 하나에서 계약으로 장식되지 않은 유형의 동작이 변경되었습니다 –
사이트 및 포인트의 조각입니다. 사이트 및 포인트 목록을 요청하는 다른 WCF 메서드가 있고 올바르게 반환되는 것처럼 둘 다 올바르게 serialize되었는지 확인할 수 있습니다. –
무시하거나 다른 것들을 가지고 있지 않으므로, 모든 Datacontract/datamember 태그를 제거하려고 시도 했습니까? 그들 중 누구도 3.5 또는 4.0에서 엄격하게 요구되지 않습니다. 그들이 없으면 클래스를 반환하는 서비스를 WCF 의미합니다. 두 개의 클래스 만 꾸며진 전체 시스템이 있습니다. 그 중 하나는 MessageContract이고 다른 하나는 IgnoreDataMembers입니다. 다른 모든 것은 독자적으로 작동합니다. :) (당신은 또한 KnownType의 알람 중 어느 쪽도 필요하지 않아야합니다.) – Tridus