2017-02-16 6 views
1

Во время де-сериализации, как игнорировать свойство? В моем случае я не хочу, чтобы свойство FullName получило инициализацию вообще. Я не ищу решения [XMLIgnore] - подумайте, что это сценарий, когда у меня нет доступа к изменению класса.C# Xml Deserialize, игнорировать данные в XML

Вот мой класс:

public class Person 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
} 

Вот как я инициализация:

Person p1 = new Person() { Id = 1, FullName = "P1" }; 
Person p2 = new Person() { Id = 2, FullName = "P2" }; 
List<Person> persons = new List<Person> { p, q }; //this object is xml serialized. 

А вот мой XML: (я получил его, хотя в XML сериализации)

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Person> 
    <Id>1</Id> 
    <FullName>P1</FullName> 
    </Person> 
    <Person> 
    <Id>2</Id> 
    <FullName>P2</FullName> 
    </Person> 
</ArrayOfPerson> 
+0

Очень грубое решение (если у вас слишком много свойств в вашем фактическом коде) было бы создание нового класса _temporary_, например. Person2, со всеми полями, кроме тех, которые вы хотите игнорировать. Используйте это для сериализации. При десериализации вы все равно можете использовать оригинальный класс. он просто оставит ваше игнорируемое значение равным нулю. Однако, если имя класса важно для вас в XML, это предложение не будет полезно. –

+0

Это может помочь вам, если мое первое предложение этого не сделает. Игнорировать свойство во время сериализации xml, но не во время десериализации] (http://stackoverflow.com/a/18242538/6741868). Другим примером того же метода Override является [Игнорировать свойство при сериализации в XML] (http://stackoverflow.com/a/23121696/6741868) –

+0

спасибо за ваши входы, но XMLAttributeOverrides помогает, когда имя элемента в xml отличное от имени свойства класса. – Sekhar

ответ

2

Вы может использовать пользовательский XmlReader в процессе десериализации, который просто пропустит элементы FullName. Что-то вроде этого:

public class MyXmlReader : XmlTextReader 
{ 
    public MyXmlReader(string filePath) : base(filePath) 
    { 
    } 

    public override bool Read() 
    { 
     if (base.Read()) 
     { 
      if (Name == "FullName") 
       return base.Read(); 

      return true; 
     } 

     return false; 
    } 
} 

Затем используйте его как этот

var serializer = new XmlSerializer(typeof(List<Person>)); 

using (var reader = new MyXmlReader("XMLFile.xml")) 
{ 
    var person = (List<Person>)serializer.Deserialize(reader); 
} 

Вы можете реализовать другой конструктор, чтобы принимать поток или что-то у вас есть. Это не должно быть путь к файлу.

+0

большое вам спасибо! это очень аккуратное решение – Sekhar