Ошибка наследования класса при сериализации wcf - PullRequest
0 голосов
/ 10 мая 2018

у нас есть два консольных приложения , которые называются «Frontend» ( FE ) и «Backend» (BE ),

, которые связаны WCF .Мне нужно иметь абстрактный класс и некоторые

унаследованные классы в BE, во время выполнения я создаю экземпляр объекта из одного из

унаследованногозанятия по Активатору.

всякий раз, когда я хочу вернуть созданный экземпляр объекта, возникает ошибка, связанная с

сериализация .это мой упрощенный код

[DataContract]
public abstract class License
{

    [DataMember]
    public int ManagedObjectCount { get; set; }
}

[DataContract]
public class LicenseMay2018 : License
{

    public Frontend.DataTypes.License GetLicenseInfo(xml xml)
    {
                    Frontend.DataTypes.LicenseMay2018 licenseVerified;
        var licXML = nodeData[0].InnerText;
        //Deserialize license
        XmlSerializer _serializer = new XmlSerializer(typeof(LicenseMay2018));
        using (StringReader _reader = new StringReader(licXML))
        {
            licenseVerified = (Frontend.DataTypes.LicenseMay2018)_serializer.Deserialize(_reader);
        }

    }

}

[DataContract]
public class LicenseApril2018 : License
{
}

на стороне BE, который я возвращаю по типу абстрактного класса, ожидается, что он вернет унаследованный класс, все прекрасно работает с помощью Activator и создания экземпляров.Единственная проблема в конце метода, когда он хочет вернуться к FE, кажется, сериализуется и отправляет обратно

public Frontend.DataTypes.License ActivateLicense(int LicenseFileId)
{
    // create in instance of inehrited class, no matter licensemay2018 or april2018 
    string assemblyName = "NMS.Common";
    var className = GetLicenseType(nodeVersion[0].InnerText);
    // exaple : className  = licensemay2018
    var handle = Activator.CreateInstance(assemblyName, className);
    var instance = (Frontend.DataTypes.License)handle.Unwrap();
    return instance.GetLicenseInfo(xmlDoc);
}

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

на момент возврата будет эта ошибка

Произошла ошибкапри попытке сериализации параметра http://tempuri.org/:ActivateLicenseResult. Сообщение InnerException было «Тип» NMS.Frontend.DataTypes.LicenseMay2018 'с именем контракта данных' LicenseMay2018: http://schemas.datacontract.org/2004/07/NMS.Frontend.DataTypes' не ожидается.Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавляя их в список известных типов, передаваемых в сериализатор. '.Пожалуйста, смотрите InnerException для получения более подробной информации.

Я не знаю, откуда они берутся: http://tempuri.org и http://schemas.datacontract.org/2004/07 ??

1 Ответ

0 голосов
/ 10 мая 2018

Вам нужно сообщить сериализатору о ваших унаследованных типах. Добавьте атрибуты KnownType для ваших унаследованных классов, например,

[DataContract]
[KnownType(typeOf(LicenseMay2018))]
[KnownType(typeOf(LicenseApril2018))]
public abstract class License
{

    [DataMember]
    public int ManagedObjectCount { get; set; }
}

[DataContract]
public class LicenseMay2018 : License
{

    public Frontend.DataTypes.License GetLicenseInfo(xml xml)
    {
        return new licenseMay2018();
    }

}

[DataContract]
public class LicenseApril2018 : License
{
}
...