嵌套 [DataContract] 未通过 WCF 序列化
我遇到的问题是,用 [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; }
...
}
和点类。
[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 签名。
I'm having an issue where a class decorated with the [DataContract]
attribute and appropriate [DataMember]
attributes on properties is not serialising nested [DataContract]
classes.
This is the class i'm trying to serialise:
[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; }
}
}
This is being sent via a WCF service being hosted in an .NET 4.0 IIS site.
My issue is that for some reason, the SourcePoint
and SourceSite
properties are not being serialised. They are just returning null. Oddly, the ExtensionData contains all the fields of those two classes.
The other strange thing, is that when I run the IIS host locally on the dev web server, they are correctly serialised. The only change between the two tests is that the endpoint in the test client is pointing to the different IIS hosts.
Anyone have any idea's what's happening here?
EDIT: Added Site & Point snippets
[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; }
...
}
And the Point class.
[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; }
}
It should be noted that BaseObject is a base class that has the same DataContract signature as the rest.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题在于,用于部署到服务器的 Visual Studio Web 安装项目未正确更新 IIS 主机的依赖项。
这意味着对数据契约的任何更改都不会被复制,从而导致问题,因为服务器不知道序列化它们的属性。
我必须从安装项目中删除项目输出并重新添加它,然后才能正确获取依赖项。
现在一切又恢复正常了!
The issue was that the Visual Studio Web Setup project, that was being used to deploy to the server, wasn't updating the dependencies of the IIS host properly.
This means that any changes to the data contracts were not being copied across, causing the issues as the server didn't know about the properties to serialise them.
I had to remove the project output from the setup project and re-add it before it would pick up the dependencies properly.
Now everything works again!