我们有两个控制台应用程序,称为“前端”(FE)和“后端”(BE),由WCF连接。我需要一个抽象类和一些BE 中的继承类,在运行时我已经从其中之一实例化了一个对象Activator 继承的类。每当我想返回实例化对象时,都会出现与连载。这是我的简化代码[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 消息是 'Type 'NMS.Frontend.DataTypes.LicenseMay2018' with data contract name 'LicenseMay2018: http://schemas.datacontract.org/2004/07/NMS.Frontend.DataTypes ' 不是预期的。如果您正在使用 DataContractSerializer 或将任何静态未知的类型添加到已知类型列表中,请考虑使用 DataContractResolver - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给序列化程序的已知类型列表中。有关更多详细信息,请参阅 InnerException。我不知道这些来自哪里:http : //tempuri.org和http://schemas.datacontract.org/2004/07 ??
1 回答
小唯快跑啊
TA贡献1863条经验 获得超2个赞
您需要告诉序列化程序您继承的类型。为您的继承类添加一个 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
{
}
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报
0/150
提交
取消