2017-02-16 4 views
1

逆シリアル化中にプロパティを無視するにはどうすればよいですか?私の場合、私はFullNameプロパティが全く初期化されないようにします。私は[XMLIgnore]ソリューションを探しているわけではありません。クラスを変更するためのアクセス権がないシナリオと考えてください。ここでC#XML 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。これをシリアル化に使用します。デシリアライズしている間も元のクラスを使用できます。あなたの無視された値をnullのままにしておきます。ただし、XMLの中でクラスの名前が重要な場合は、この提案は役に立ちません。 –

+0

これは私の最初の提案が役立たない場合に役立ちます。 [xml直列化中にプロパティを無視するが、直列化解除時には無視する](http://stackoverflow.com/a/18242538/6741868)。同じオーバーライドメソッドのもう1つの例は、[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