1. ホーム
  2. c#

[解決済み] Xmlシリアライゼーション - NULL値を隠す

2022-05-12 17:05:11

質問

標準的な.NET Xmlシリアライザを使用する場合、すべてのNULL値を隠す方法はありますか? 以下は、私のクラスの出力の例です。私は、NULLに設定されている場合、NULL可能な整数を出力したくありません。

現在のXml出力です。

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myNullableInt p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
   <myOtherInt>-1</myOtherInt>
</myClass>

私が欲しいもの

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myOtherInt>-1</myOtherInt>
</myClass>

どのように解決するのですか?

関数を作るには、パターン ShouldSerialize{PropertyName} で、XmlSerializer にメンバーをシリアライズするかどうかを指示します。

例えば、クラスのプロパティが MyNullableInt という名前の場合、次のようになります。

public bool ShouldSerializeMyNullableInt() 
{
  return MyNullableInt.HasValue;
}

以下は完全なサンプルです。

public class Person
{
  public string Name {get;set;}
  public int? Age {get;set;}
  public bool ShouldSerializeAge()
  {
    return Age.HasValue;
  }
}

次のコードでシリアライズされます。

Person thePerson = new Person(){Name="Chris"};
XmlSerializer xs = new XmlSerializer(typeof(Person));
StringWriter sw = new StringWriter();
xs.Serialize(sw, thePerson);

結果は以下のようなXMLになります - Ageがないことに注意してください。

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Chris</Name>
</Person>