wcf 序列化继承类错误

我们有两个控制台应用程序,称为“前端”(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 ??


翻翻过去那场雪
浏览 121回答 1
1回答

小唯快跑啊

您需要告诉序列化程序您继承的类型。为您的继承类添加一个 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{}
打开App,查看更多内容
随时随地看视频慕课网APP