2017-08-21 12 views
0

私はこのようなXML要素を持っている:値のない整数要素をシリアル化する方法は?

<framerate_denominator nil="true"/> 

私のクラスのメンバーは次のように飾られている次のように

[XmlElement("framerate_denominator")] 
public int? FramerateDenominator; 

public bool ShouldSerializeFramerateDenominator() { return FramerateDenominator.HasValue; } 

私のコードは次のとおりです。

using Serialization; 
using System.IO; 
using System.Xml.Serialization; 

namespace SerializationSandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // read 
      Job job = null; 
      string path = @"C:\sample_job.xml"; 

      XmlSerializer xmlSerializer = new XmlSerializer(typeof(Job)); 
      using (StreamReader reader = new StreamReader(path)) 
      { 
       //EXCEPTION HERE 
       job = (Job)xmlSerializer.Deserialize(reader); 
       reader.Close(); 
      } 

      // write 
      xmlSerializer = new XmlSerializer(job.GetType()); 
      using (StringWriter textWriter = new StringWriter()) 
      { 
       xmlSerializer.Serialize(textWriter, job); 
       var text = textWriter.ToString(); 
      } 
     } 
    } 
} 

私はXMLを逆シリアル化すると次の例外が発生します。

FormatException:入力文字列の形式が正しくありません。

nil="true"属性値を使用してこれらの要素をどのように処理できるかは完全にはわかりません。誰にもアドバイスはありますか?

事前のおかげで...

+1

それはxmlには存在しませんが、私は[ここ](https://stackoverflow.com/a/2966688/4519059)のようにそれらのタグをスキップするように提案することができます。 –

+1

'nil'がサポートされるためには、' xsi'名前空間に存在する必要があります。 [the docs](https://msdn.microsoft.com/en-us/library/ybce7f69(v = vs.100).aspx)を参照してください。記述したとおりの場合は、これを明示的に処理する必要があります。 –

+0

@ shA.t私は現在、そこに提案のハックな実装をしています。 Linqを使ってXDocumentから空のノード値を取り出しています。このトリックをするように見えますが、私は以下のあなたの答えは、私が実装を終わらせるものだと思います。 – kevp

答えて

1

私はいくつかの類似した質問をチェックして、それについて答えとして私はJobクラスのFramerateDenominatorを変更することをお勧めすることができます: `XmlSerializer`がnullのプロパティを行いますと

[XmlElement("framerate_denominator")] 
public string _FramerateDenominator { get; set; } 

[XmlIgnore] 
public int? FramerateDenominator 
    => !string.IsNullOrEmpty(_FramerateDenominator) 
     ? (int?) int.Parse(_FramerateDenominator) 
     : null; 
+0

興味深いことに、値をクリーンアップする無名関数を定義することができます。私は今夜​​これを試してみるよ、ありがとう。 – kevp

関連する問題