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