2011-02-14 97 views
1

不串行化的我在哪裏飾以[DataContract]屬性和相應的屬性[DataMember]上屬性的類不連載嵌套[DataContract]類的問題。嵌套[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; } 
    } 
} 

這是正在通過WCF服務發送被託管在.NET 4.0 IIS站點。

我的問題是,由於某些原因,SourcePointSourceSite屬性沒有被序列化。他們只是返回null。奇怪的是,ExtensionData包含這兩個類的所有字段。

另一個奇怪的是,當我在dev web服務器上本地運行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; } 
    ... 
} 

和點類。

[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

Site和Point的外觀如何?如果我不得不盲目猜測:生產服務器是否運行相同版本的.NET?未在合同中修飾的類型的行爲在其中一個服務包中發生更改 – 2011-02-14 23:06:20

回答

1

問題是,用於部署到服務器的Visual Studio Web安裝項目沒有正確更新IIS主機的依賴關係。

這意味着數據合同的任何更改都不會被複制,因爲服務器不知道要將它們序列化的屬性,所以導致出現問題。

我不得不從設置項目中刪除項目輸出並重新添加它,然後才能正確地獲取依賴關係。

現在一切正常了!