у нас есть два консольных приложения , которые называются «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 ??