Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlSerializer+;多态性_C#_Inheritance_Xmlserializer - Fatal编程技术网

C# XmlSerializer+;多态性

C# XmlSerializer+;多态性,c#,inheritance,xmlserializer,C#,Inheritance,Xmlserializer,给定一个(人为的)基类和一个子类,我们希望使用XmlSerializer通过WCF进行序列化。我们根据以下文章装饰一个集合(请参见响应类): (见备注部分) 问题是,尽管似乎生成了正确的WSDL,但SVCUtil生成了一个类文件,其中GetUserResponse类包含一个名为Items的属性。这与将[XmlElement]应用于数组有关吗?尽管XmlArray元素没有类型属性 提前谢谢 [Serializable] [XmlType] public class UserBase { p

给定一个(人为的)基类和一个子类,我们希望使用XmlSerializer通过WCF进行序列化。我们根据以下文章装饰一个集合(请参见响应类):

(见备注部分)

问题是,尽管似乎生成了正确的WSDL,但SVCUtil生成了一个类文件,其中GetUserResponse类包含一个名为Items的属性。这与将[XmlElement]应用于数组有关吗?尽管XmlArray元素没有类型属性

提前谢谢

[Serializable]
[XmlType]
public class UserBase
{
    public int Id {get;set;}
}

[Serializable]
[XmlType]
public class BasicUser : UserBase
{
    public string UserName {get;set;}
}

[Serializable]
[XmlType]
public class SuperUser : UserBase
{
    public string UserName {get;set;}
    public bool SpecialLevel {get;set;}

}

[Serializable]
[XmlType]
public class GetUserResponse
{
    [XmlElement("Users", typeof(User)), XmlElement("SuperUsers", typeof(SuperUser))]
    public List<UserBase> Users {get;set;}
}
[可序列化]
[XmlType]
公共类用户基
{
公共int Id{get;set;}
}
[可序列化]
[XmlType]
公共类BasicUser:UserBase
{
公共字符串用户名{get;set;}
}
[可序列化]
[XmlType]
公共类超级用户:UserBase
{
公共字符串用户名{get;set;}
公共布尔特殊级别{get;set;}
}
[可序列化]
[XmlType]
公共类GetUserResponse
{
[XmlElement(“用户”,类型(用户)),XmlElement(“超级用户”,类型(超级用户))]
公共列表用户{get;set;}
}

因为您正在集合属性上使用
[xmlement]
,所以相应的xml将类似于:

<GetUserResponse>
    <Users>{this is a user}</Users>
    <Users>{this is a user}</Users>
    <SuperUsers>{this is a super user}</SuperUsers>
    <Users>{this is a user}</Users>
    <SuperUsers>{this is a super user}</SuperUsers>
</GetUserResponse>
为了建立:

<GetUserResponse>
    <Users>
        <User>{this is a user}</User>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
    </Users>
</GetUserResponse>

{这是一个用户}
{这是一个用户}
{这是一个超级用户}
{这是一个用户}
{这是一个超级用户}

然后您将拥有一个
Users
属性。

为什么需要使用XmlSerializer?为什么不直接使用更快更灵活的数据协定序列化程序呢?顺便说一句,
[Serializable]
不会在这里添加任何内容,除非您还在某处使用
二进制格式化程序。@John-谢谢你,伙计-我们只经历了100000000个小时的XmlSerializer带来的不必要的麻烦。它不是被选择使用的。存在互操作问题(即DataContractSerializer在我们需要的地方实际上不够灵活)。@Marc-Thank-good to know.OMG。为什么我没有看到XmlArray ctor有一个类型覆盖????我会很快测试一下,然后把答案记下来。谢谢你,马克。
<GetUserResponse>
    <Users>
        <User>{this is a user}</User>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
    </Users>
</GetUserResponse>