Пользовательские объекты в WCF - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть следующий объект, он отлично работает, когда я задаю стандартные объекты, такие как int, string, а не с пользовательским объектом.

[DataContract(Namespace = "")]
public class StatusLog<TItem>
{
    /// <summary>
    /// Gets or sets the key.
    /// </summary>
    /// <value>
    /// The key.
    /// </value>
    [DataMember]
    public Guid Id { get; set; }

    /// <summary>
    /// Gets or sets the action status.
    /// </summary>
    /// <value>
    /// The action status.
    /// </value>
    [DataMember]
    public ActionStatus ActionStatus { get; set; }

    /// <summary>
    /// Gets or sets the object.
    /// </summary>
    /// <value>
    /// The object.
    /// </value>
    [DataMember]
    public TItem Object { get; set; }

    /// <summary>
    /// Gets or sets the message.
    /// </summary>
    /// <value>
    /// The message.
    /// </value>
    [DataMember]
    public string Message { get; set; }
}

Это работает: вернуть новый StatusLog {Id = Guid.NewGuid (), ActionStatus = ActionStatus.Deleted, Object = Convert.ToInt32 (id), Message = "Узел успешно удален"};

Это не работает: new StatusLog {Id = Guid.NewGuid (), ActionStatus = ActionStatus.Created, Object = MyCustomObject};

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Посмотрите на атрибут KnownType.

1 голос
/ 15 сентября 2011

Как упоминалось в flosk8, DataContractSerializer не будет знать, какие типы следует учитывать при десериализации вашего DataContract, если только он не украшен атрибутом KnownType.

http://msdn.microsoft.com/en-us/library/ms730167.aspx

Попробуйте добавить следующий атрибут в ваш DataContract:

[DataContract(Namespace = "")]
[KnownType(typeof(MyCustomObject))]
public class StatusLog<TItem>
{
  // ... snip ...
}

Вам потребуется добавить этот атрибут для каждого типа, который, возможно, потребуется десериализовать в свойство StatusLog.Object. Кроме того, каждый из этих типов должен быть сериализуемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...