Вложенный [DataContract] не сериализуется через WCF - PullRequest
1 голос
/ 15 февраля 2011

У меня проблема с тем, что класс, украшенный атрибутом [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, что и остальные.

1 Ответ

1 голос
/ 15 февраля 2011

Проблема заключалась в том, что проект веб-установки Visual Studio, который использовался для развертывания на сервере, не обновлял зависимости узла IIS должным образом.

Это означает, что любые изменения в контрактах данных не копировались, что приводило к проблемам, так как сервер не знал о свойствах для их сериализации.

Мне пришлось удалить выходные данные проекта из проекта установки и повторно добавить их, прежде чем они правильно подберут зависимости.

Теперь все снова работает!

...