2014-09-12 46 views
3

我有一个asp.net web api项目,我遇到了一个用户模型问题,它有字符串[]角色作为属性,因为我没有序列化。用DataContractSerializer处理序列化数组

用户模型:

[DataContract(Namespace = "")] 
public class User 
{ 
    [DataMember(Order = 0)] 
    public string UserName { get; set; } //ro 

    [DataMember(Order = 1)] 
    public int CustomerID { get; set; } //ro 

    [DataMember(Order = 2)] 
    public string Email { get; set; } 

    [DataMember(Order = 3)] 
    public string Phone { get; set; } 

    [DataMember(Order = 4)] 
    public string Mobile { get; set; } 

    [DataMember(Order = 5)] 
    public string FullName { get; set; } 

    [DataMember(Order = 6)] 
    public List<string> Roles { get; set; } 

    [DataMember(Order = 7)] 
    public string Culture { get; set; } 

    [DataMember(Order = 8)] 
    public string Language { get; set; } 

    [DataMember(Order = 9)] 
    public string TimeZone { get; set; } 

    [DataMember(Order = 10)] 
    public DateTime Created { get; set; } //ro 

} 

,当我得到的结果的请求,这是一样的东西如下: -

<User xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <UserName>User1</UserName> 
    <CustomerID>1234</CustomerID> 
    <Email>[email protected]</Email> 
    <Phone/> 
    <Mobile/> 
    <FullName>XYZ</FullName> 
    <Roles xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <d2p1:string>AdminRole</d2p1:string> 
    <d2p1:string>AlertsRole</d2p1:string> 
    </Roles> 
    <Culture>en-IN</Culture> 
    <Language>en</Language> 
    <Created>2014-04-21T11:26:22</Created> 
</User> 

,但我想要的XML如下: -

<User xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <UserName>User1</UserName> 
    <CustomerID>1234</CustomerID> 
    <Email>[email protected]</Email> 
    <Phone/> 
    <Mobile/> 
    <FullName>XYZ</FullName> 
    <Roles> 
    <string>Role1</string> 
    <string>Role2</string> 
    </Roles> 
    <Culture>en-IN</Culture> 
    <Language>en</Language> 
    <Created>2014-04-21T11:26:22</Created> 
</User> 

请提出我可以实施的任何解决方案。

在此先感谢

+0

创建一个自定义类'RolesList'继承'名单'和自己实现XML序列化。 – Styxxy 2014-09-12 11:08:59

+0

你是否需要在User类上设置命名空间? – 2014-09-12 11:14:24

回答

2

您可以通过使用相同的命名空间创建一个集合类型做到这一点:

[CollectionDataContract(Namespace = "")] 
public class StringList : List<string> 
{ 
    public StringList() { } 

    public StringList(IEnumerable<string> items) : base(items) { } 
} 

[DataContract(Namespace = "")] 
public class User 
{ 
    [DataMember(Order = 0)] 
    public string UserName { get; set; } //ro 

    [DataMember(Order = 1)] 
    public int CustomerID { get; set; } //ro 

    [DataMember(Order = 2)] 
    public string Email { get; set; } 

    [DataMember(Order = 3)] 
    public string Phone { get; set; } 

    [DataMember(Order = 4)] 
    public string Mobile { get; set; } 

    [DataMember(Order = 5)] 
    public string FullName { get; set; } 

    [DataMember(Order = 6)] 
    public StringList Roles { get; set; } 

    [DataMember(Order = 7)] 
    public string Culture { get; set; } 

    [DataMember(Order = 8)] 
    public string Language { get; set; } 

    [DataMember(Order = 9)] 
    public string TimeZone { get; set; } 

    [DataMember(Order = 10)] 
    public DateTime Created { get; set; } //ro 
} 
+0

我也想处理Post方案......但是我得到的Roles对象始终为空。我试过StringList:列表和列表。在请求正文中,它角色1。但是我的角色对象仍然没有填充。请任何人帮助我吗? – 2014-09-15 07:41:06

+1

如果您继承了通用类型(例如'Collection '),那么您还必须使用['KnownType'属性](http://stackoverflow.com/a/4875229/393280)。 – palswim 2016-04-29 20:49:06

相关问题