クラスの 1 つで IXMLSerializable を実装しています。null 許容の数値プロパティがいくつか含まれています (int? double? など)。
IXMLSerializable を介してこれらをシリアル化/シリアル化する正しい方法は何ですか? これが私が今していることです。これは機能しますが、明らかに正しい方法ではないようです。
void IXmlSerializable.WriteXml(XmlWriter writer)
{
...
if (this._PropName == null)
{
writer.WriteElementString("PropName", "NULL");
}
else
{
writer.WriteElementString("PropName", this._PropName.ToString());
}
...
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
string tempStr;
...
reader.ReadStartElement("PropName");
if (tempStr != "NULL")
{
this._PropName = double.Parse(tempStr);
}
else
{
this._PropName = null;
}
...
}
更新: IXmlSerializable を実装している理由について、少し背景を説明するように求められました。私は床のコレクションを表すクラスが必要な建築設計のプログラムに取り組んでいます。各フロアには、 Floor.Areaエリア、Floor.Heightなどのプロパティがあります。ただし、フロアの高さは、その下のフロアの高さの合計によって定義されます。したがって、Floor.Heightプロパティが変更されるか、FloorCollectionが変更されるたびに、フロアの高さが再計算されます。
シリアル化する必要がある FloorCollectionクラスは、BindingList から継承しています。このクラスを直接シリアル化しようとすると、フロアのコレクションがシリアル化されますが、クラスのプロパティやフィールドはシリアル化されません。これに関する私の以前の投稿を参照してください。
現在、コレクション内の建物の床の最大高さ、最大上部高さ、および最小下部高さを制限する機能を追加しようとしています。したがって、これらの制限を表すために nullable double を使用しています。null 値は無制限を意味します。標高プロパティは、正、負、またはゼロにすることができます。そのため、制限がない場合を識別する別の状態 null が必要です。
標高/高さの制限があるかどうかを識別する別のブール値と、それが有効な場合に制限が何であるかを識別する通常の double プロパティを持つ方が全体的に簡単かもしれないと考えています。