为了账号安全,请及时绑定邮箱和手机立即绑定

wcf 序列化继承类错误

wcf 序列化继承类错误

C#
翻翻过去那场雪 2021-06-03 07:21:53
我们有两个控制台应用程序,称为“前端”(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

{

}


查看完整回答
反对 回复 2021-06-05
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信