【问题标题】:C# XML serialize specific elements from an arrayC# XML 序列化数组中的特定元素
【发布时间】:2016-04-13 06:55:11
【问题描述】:

我想根据某些条件序列化数组的某些特定元素。

例如:

public class Team 
{
    public string Name {get; set;}  
    public Person[] Staff;}

public class Person
{
    public string Name {get; set;}
    public NrOfHolidays {get; set;}
}

当序列化 Team 类时,我只想序列化 Staff 数组中 NrOfHolidays 大于 10 的成员。

有没有办法做到这一点?

我知道ShouldSerialize[MemberName] 函数如何用于序列化/不序列化给定成员,但我不知道它是否可以应用于作为成员的数组的元素。

编辑: 感谢您的回复。

我刚刚找到了这个post。 这是我面临的完全相同的问题,但这里提出的解决方案是针对 JSON 的。我正在寻找类似于上述帖子中提出的解决方案,它适用于 XML 序列化。

【问题讨论】:

  • 在使用 LINQ 查询序列化之前简单地过滤数组

标签: c# arrays xml serialization


【解决方案1】:

您可以将数组标记为不可序列化,然后创建一个用于序列化的属性,该属性使用 linq 查询过滤该数组:

public class Team 
{
    public string Name {get; set;}  
    [XmlIgnoreAttribute]
    public Person[] Staff{ get; set; }
    public Person[] SerializationStaff
    {

        get
        { 
              return Staff == null ? null : Staff.Where(s => s.NrOfHolidays > 10).ToArray(); 
        }

        set
        {
             Staff = value;
        }
    }
}

public class Person
{
    public string Name {get; set;}
    public int NrOfHolidays {get; set;}
}

【讨论】:

  • 不错的解决方案,无需进行任何进一步的外部更改。但是,您可以使用 XmlElement("Staff") 将 SerializationStaff-tag-name 替换为适当的名称
  • 确实你可以并且可以是一个很好的改进,但为了清楚起见,我认为最好保留这个示例代码。
  • 它没有,至少使用此代码所针对的 XmlSerializer。二进制序列化是一个非常糟糕的主意,当您的项目更改其版本时,它将停止工作(至少没有变通方法),
  • 感谢您的回复,您的解决方案确实解决了手头的问题,但我在这篇文章中寻找类似的东西:stackoverflow.com/questions/20955722/… 与 XML 序列化一起使用。
【解决方案2】:

你为什么不创建一个新团队,只包括那些有条件的Persons:

var newTeam = new Team(myTeam.Staff.Where(x => x.Holidays > 10));

假设您有一个 Team 的构造函数,它需要一组 Person。现在您可以序列化该团队而不是原始团队。

如果不使用 default-ctor 并在之后设置属性:

var newTeam = new Team();
newTeam.Stuff = myOldTeam.Staff.Where(...);

这不需要对您的Team-class 进行任何更改,但是您必须在客户端做一些小工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多