Проблема десериализации объекта между двумя разными DataContracts - PullRequest
1 голос
/ 08 мая 2019

В моей архитектуре решения я придерживаюсь следующего: enter image description here

У меня проблема десериализации объекта. В процессе десериализации я получаю следующее исключение из моего клиентского приложения.

{"Невозможно десериализовать тело XML с корневым именем« Пользователь »и корневым пространством имен» http://schemas.datacontract.org/2004/07/ECMS.Business.Entities' (для операции «Вход в систему» ​​и контракта («ISecurityService», «http://tempuri.org/')) с использованием DataContractSerializer. Убедитесь, что что тип, соответствующий XML, добавлен в коллекцию известных типов службы. "}

В проекте ECMS.Business.Entities у меня есть следующая сущность

[DataContract]
public class User : IIdentifiableEntity
{
    [DataMember]
    public int Id { get; set; }
    public int EntityId
    {
        get => Id;
        set => Id = value;
    }
    [DataMember]
    public string UserName { get; set; }
    [DataMember]
    public string FullName { get; set; }
    public string Password { get; set; }
    [DataMember]
    public int Role { get; set; }
    public bool IsActive { get; set; }

    public ICollection<UserSession> Sessions { get; set; }
    public ICollection<Visit> Visits { get; set; }
}

Который мне нужно вернуть обратно на сторону клиента (проект ECMS.Client.Entities) в качестве следующего объекта

[DataContract]
public class User : ObjectBase
{
    private int _id;

    [DataMember]
    public int Id
    {
        get => _id;
        set
        {
            if (_id != value)
            {
                _id = value;
                OnPropertyChanged();
            }
        }
    }

    private string _userName;

    [DataMember]
    public string UserName
    {
        get => _userName;
        set
        {

            if (_userName != value)
            {
                _userName = value;
                OnPropertyChanged();
            }
        }
    }

    private string _fullName;

    [DataMember]
    public string FullName
    {
        get => _fullName;
        set
        {
            if (_fullName != value)
            {
                _fullName = value;
                OnPropertyChanged();
            }
        }
    }

    private int _role;
    [DataMember]
    public int Role
    {
        get => _role;
        set
        {
            if (_role != value)
            {
                _role = value;
                OnPropertyChanged();
            }
        }
    }
}

[DataContract]
public abstract class ObjectBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

1 Ответ

2 голосов
/ 08 мая 2019

Пространства имен DataContact должны совпадать при использовании отдельных серверных и клиентских контрактов!

С здесь :

Чтобы контракты данных были эквивалентны, они должны иметьодно и то же пространство имен и имя

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