26

XML スキーマ パート 2 では、ブール値として定義されたデータ型のインスタンスが、次の正当なリテラル {true、false、1、0} を持つことができると規定しています。たとえば、次の XML は、逆シリアル化されると、ブール型のプロパティ "Emulate" を に設定しtrueます。

<root>
    <emulate>1</emulate>
</root>

ただし、オブジェクトを XML にシリアル化すると、true代わりに数値が返されます。私の質問は、XML でブール表現を制御できる方法はありますか?

4

3 に答える 3

55

XmlSerializer 属性のブラック マジックを使用して、これを行うこともできます。

[XmlIgnore]
public bool MyValue { get; set; }

/// <summary>Get a value purely for serialization purposes</summary>
[XmlElement("MyValue")]
public string MyValueSerialize
{
    get { return this.MyValue ? "1" : "0"; }
    set { this.MyValue = XmlConvert.ToBoolean(value); }
}

気分を害した場合は、他の属性を使用して、このメンバーを IntelliSense から非表示にすることもできます。これは完全な解決策ではありませんが、IXmlSerializable を実装するよりも高速になる可能性があります。

于 2008-09-17T17:11:13.933 に答える
3

クラスのシリアル化された出力を必要に応じて変更できる IXmlSerializable を実装できます。これには、GetSchema()、ReadXml(XmlReader r)、WriteXml(XmlWriter r) の 3 つのメソッドを作成する必要があります。インターフェイスを実装すると、.NET がオブジェクト自体をシリアル化しようとする代わりに、これらのメソッドが呼び出されます。

例は次の場所にあります。

http://www.developerfusion.co.uk/show/4639/および

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixlserializable.aspx

于 2008-09-17T15:31:20.493 に答える
1

いいえ、デフォルトの System.Xml.XmlSerializer を使用していません。それを実現するには、データ型を int に変更するか、独自のシリアル化コードを提供する必要があります (可能ですが、あまり面白くありません)。

ただし、XSLT を使用するか、単純に文字列置換を使用して、生成された XML を単純に後処理することもできます。ちょっとしたハックですが、開発時と実行時の両方で非常に高速です...

于 2008-09-17T15:30:40.213 に答える