2016-01-08 6 views
-2

Я хотел бы сериализовать некоторые конкретные элементы массива на основе некоторого условия.C# XML сериализует определенные элементы из массива

Для примера:

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.

+3

Просто фильтруйте массив до его сериализации с помощью запроса LINQ – Gusman

ответ

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;} 
} 
+0

Хорошее решение без каких-либо дальнейших внешних изменений. Однако вы можете заменить имя тега 'SerializationStaff' соответствующим, используя' XmlElement («Staff») ' – HimBromBeere

+0

Действительно, вы можете и можете быть очень хорошим улучшением, но для ясности я думаю, что лучше оставить этот примерный код как является. – Gusman

+0

Это не означает, по крайней мере, использование XmlSerializer, для которого предназначен этот код. Двоичная сериализация - очень плохая идея, когда ваш проект меняет свою версию, он перестанет работать (по крайней мере, без обходных решений), – Gusman

0

Почему Разве вы не можете создать новую команду, включая только те Person с, что есть условие:

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

Если у вас есть конструктор для Team, который ожидает набор Person. Теперь вы можете сериализовать эту команду вместо оригинальной.

Если не использовать по умолчанию-CTOR и установить свойство впоследствии:

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

Это won't нужны какие-либо изменения на вашем Team -класса, однако вы должны сделать какую-нибудь работу на стороне клиента ,

Смежные вопросы