2011-02-14 109 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主机的依赖关系。

这意味着数据合同的任何更改都不会被复制,因为服务器不知道要将它们序列化的属性,所以导致出现问题。

我不得不从设置项目中删除项目输出并重新添加它,然后才能正确地获取依赖关系。

现在一切正常了!