【问题标题】:Handle array in serialization with DataContractSerializer使用 DataContractSerializer 在序列化中处理数组
【发布时间】:2014-09-12 11:03:11
【问题描述】:

我有一个 asp.net web api 项目,但我遇到了用户模型的问题,它具有字符串 [] 角​​色作为属性,它没有按我的意愿序列化。

用户模型:

[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>abc@xyz.lmn</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>abc@xyz.lmn</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>

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

提前致谢

【问题讨论】:

  • 创建一个继承List&lt;string&gt;的自定义类RolesList,自己实现XML序列化。
  • 用户类需要设置命名空间吗?

标签: c# datacontractserializer


【解决方案1】:

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

[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
}

【讨论】:

  • 我也想处理 Post 场景...但是我的 Roles 对象始终为空。我试过 StringList:List 和 List。在请求正文中,它是 Role1。但是我的 Roles 对象仍然没有被填充。谁能帮帮我?
  • 如果你继承自一个泛型类型(例如Collection&lt;T&gt;),那么你还必须使用KnownType attribute
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2011-03-10
  • 2021-02-13
  • 2013-06-01
  • 1970-01-01
相关资源
最近更新 更多