Wcf Xml反序列化无法识别生成的代理派生类

Wcf Xml反序列化无法识别生成的代理派生类,wcf,inheritance,xml-serialization,deserialization,derived-class,Wcf,Inheritance,Xml Serialization,Deserialization,Derived Class,我在尝试将XML反序列化为具有派生类型的自动生成的代理类时遇到了严重的麻烦 这是我使用Xml.Serialization的场景 作为合同一部分的一个WCF 4.0服务共享类型: [XmlRootAttribute(Namespace = "", IsNullable = false)] public class InstallerConfig { [XmlArray] [XmlArrayItem(typeof(FileExistsRequisite))] [XmlArra

我在尝试将XML反序列化为具有派生类型的自动生成的代理类时遇到了严重的麻烦

这是我使用Xml.Serialization的场景

作为合同一部分的一个WCF 4.0服务共享类型:

[XmlRootAttribute(Namespace = "", IsNullable = false)]
public class InstallerConfig
{
    [XmlArray]
    [XmlArrayItem(typeof(FileExistsRequisite))]
    [XmlArrayItem(typeof(RegistryKeyExistsRequisite))]
    public List<ModuleRequisite> Prerequisites { /* getter and setter */ }

    ...
}
如果我尝试序列化然后反序列化InstallerConfig实例,则序列化和反序列化都会按预期工作

这是生成的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<InstallerConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Prerequisites>
        <RegistryKeyExistsRequisite>
            <RequisiteOrder>1</RequisiteOrder>
            <!-- Some other elements with their values -->
        </RegistryKeyExistsRequisite>
        <FileExistsRequisite>
            <RequisiteOrder>2</RequisiteOrder>
            <!-- Some other elements with their values -->
        </FileExistsRequisite>
    </Prerequisites>
</InstallerConfig>
XmlSerializer serializer = new XmlSerializer(typeof(WCFWebReference.InstallerConfig));
XmlTextReader stream = new XmlTextReader("deserializedXML.xml");
WCFWebReference.InstallerConfig desInstallerConfig = (WCFWebReference.InstallerConfig)serializer.Deserialize(stream);
创建的DeInstallerConfig对象有一个空ModuleRequisite对象数组MyNamespace.WCFWebReference.ModuleRequisite[0]作为前提字段的值,而XML实际上有两个元素都是从ModuleRequisite派生的

我做错了什么?对这个麻烦感到非常沮丧:-

提前谢谢。

我解决了我的问题

首先,我从InstallerConfig类的Premissions属性中删除了所有XML装饰标记。这使得在序列化之后,XML中派生类的元素不再显示为,而是显示为

在客户端,反序列化时,我在XmlSerializer构造函数中添加了派生类作为额外类型:

List<Type> extraTypes = new List<Type>() {
    extraTypes.Add(typeof(WCFWebReference.FileExistsRequisite)),
    extraTypes.Add(typeof(WCFWebReference.RegistryKeyExistsRequisite))
};
XmlSerializer serializer = new XmlSerializer(
    typeof(WCFWebReference.InstallerConfig), extraTypes.ToArray());
这使应用程序代码能够将任何ModuleRequest派生类强制转换为xsi:type XML属性中定义的相应类型。

我解决了我的问题

首先,我从InstallerConfig类的Premissions属性中删除了所有XML装饰标记。这使得在序列化之后,XML中派生类的元素不再显示为,而是显示为

在客户端,反序列化时,我在XmlSerializer构造函数中添加了派生类作为额外类型:

List<Type> extraTypes = new List<Type>() {
    extraTypes.Add(typeof(WCFWebReference.FileExistsRequisite)),
    extraTypes.Add(typeof(WCFWebReference.RegistryKeyExistsRequisite))
};
XmlSerializer serializer = new XmlSerializer(
    typeof(WCFWebReference.InstallerConfig), extraTypes.ToArray());

这允许应用程序代码将任何ModuleRequest派生类强制转换为xsi:type XML属性中定义的相应类型。

您能否澄清共享这些类型的WCF 4.0服务的含义?您的意思是InstallerConfig是合同的一部分,还是说客户机实际引用了包含InstallerConfig的同一DLL作为服务?如果客户端看到的前一个InstallerConfig是根据服务传递的定义构建的新类,而不是原始类,那么将丢失属性。因此,您有两个应用程序,XML的反序列化在其中一个应用程序中工作,而不是在另一个应用程序中。是吗?@Basiclife:对不起,意思是InstallerConfig是合同的一部分。但是这种属性信息的丢失只发生在派生属性类型中。事实上,我在这里使用其他通用和非通用集合作为InstallerConfig属性,我成功地将它们序列化和反序列化了。@Cheeso就是这样。反序列化在WCF端正常工作,但在客户端不正常如果右键单击,然后转到客户端应用程序中InstallerConfig上的定义,该类是否有明显的错误?它是否具有您期望的所有属性/属性?我是否与WCF端的等价物相同?您能否澄清共享这些类型的WCF 4.0服务的含义?您的意思是InstallerConfig是合同的一部分,还是说客户机实际引用了包含InstallerConfig的同一DLL作为服务?如果客户端看到的前一个InstallerConfig是根据服务传递的定义构建的新类,而不是原始类,那么将丢失属性。因此,您有两个应用程序,XML的反序列化在其中一个应用程序中工作,而不是在另一个应用程序中。是吗?@Basiclife:对不起,意思是InstallerConfig是合同的一部分。但是这种属性信息的丢失只发生在派生属性类型中。事实上,我在这里使用其他通用和非通用集合作为InstallerConfig属性,我成功地将它们序列化和反序列化了。@Cheeso就是这样。反序列化在WCF端正常工作,但在客户端不正常如果右键单击,然后转到客户端应用程序中InstallerConfig上的定义,该类是否有明显的错误?它是否具有您期望的所有属性/属性?我是否与WCF端等效物相同?