我遇到的问题是,使用[DataContract]
属性和属性上适当的[DataMember]
属性修饰的类不会序列化嵌套的[DataContract]
类。
这是我正在尝试序列化的课程:
[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站点中的WCF服务发送的。
我的问题是,出于某种原因,SourcePoint
和SourceSite
属性未被序列化。他们只是返回null。奇怪的是,ExtensionData包含这两个类的所有字段。
另一个奇怪的事情是,当我在开发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; }
...
}
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 :(得分:1)
问题在于,用于部署到服务器的Visual Studio Web安装项目未正确更新IIS主机的依赖项。
这意味着对数据合同的任何更改都没有被复制,导致问题,因为服务器不知道要对它们进行序列化的属性。
我必须从安装项目中删除项目输出并重新添加它才能正确获取依赖项。
现在一切都恢复了!