У меня проблема с тем, что класс, украшенный атрибутом [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; }
}
}
Это отправляется через службу WCF, размещенную на сайте .NET 4.0 IIS.
Моя проблема в том, что по некоторым причинам свойства SourcePoint
и SourceSite
не сериализуются. Они просто возвращают ноль. Как ни странно, ExtensionData содержит все поля этих двух классов.
Еще одна странная вещь: когда я запускаю хост IIS локально на веб-сервере dev, они корректно сериализуются. Единственное изменение между этими двумя тестами заключается в том, что конечная точка в тестовом клиенте указывает на разные хосты 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, что и остальные.