これが私の質問を示す自己完結型のサンプル プログラムです: https://gist.github.com/jennings/46c20733df559d02b9ad
私はMaybe<T>
次のようなタイプを書いています:
public struct Maybe<T> : IXmlSerializable where T : class
{
readonly T _value;
//...
}
シリアライゼーションのこれら 2 つの目標のいずれかを達成できますか?
型のプロパティがシリアル化されている場合、 null
Maybe<T>
の場合はプロパティをまったく発行しないでください(文字列プロパティにはこの動作があるようです)。_value
_value
の代わりに をシリアル化しMaybe<T>
ます。
したがって、私の型を使用するクラスが次のようになっているとします。
public class AnyRandomObjectUsingMyType
{
public Maybe<string> MaybeAString{ get; set; }
}
次に、MaybeaString._value
null の場合、シリアル化するときにこれが必要です。
<AnyRandomObjectUsingMyType>
</AnyRandomObjectUsingMyType>
私はこれらのどちらも望んでいません:
<AnyRandomObjectUsingMyType>
<MaybeAString xsi:nil="true" />
</AnyRandomObjectUsingMyType>
<AnyRandomObjectUsingMyType>
<MaybeAString></MaybeAString>
</AnyRandomObjectUsingMyType>
シリアライゼーションを設定したくありませんAnyRandomObjectUsingMyType
。非常に多くのものがあるからです。Maybe<T>
どこでも同じ動作が得られるように、これを制御したいのです。
いくつかのコンテキスト
この型Maybe<T>
は、 のドロップイン置換を意味しT
ます。しかし、いくつかの場所で XML シリアライゼーションを使用しています。次のようなオブジェクトがある場合:
// Version 1 class
public class SomethingBeingSerialized
{
public string SomeValue { get; set; }
}
SomeValue が null の場合、このクラスは次のようにシリアル化されます。
<SomethingBeingSerialized>
</SomethingBeingSerialized>
クラスをこれに変更できるようにしたい:
// Version 2 class
public class SomethingBeingSerialized
{
public Maybe<string> SomeValue { get; set; }
}
そして、シリアル化された表現が同一であることを望みます。V1 アプリがデシリアライズすると、null 文字列が取得されます。V2 アプリがデシリアライズすると、Maybe<string>
None を表す が取得されます。
私は自分のIXmlSerializable.WriteXml
メソッドでこれをやろうとしましたが、それが呼び出されると、XmlWriter はすでにこれを基礎となるストリームに書き込んでいるようです:
<SomeValue
したがって、私のWriteXml
メソッドが呼び出されるまでには、手遅れのようです。多分これを制御する別の方法がありますか?
シリアライザーに次のように指定できれば、「タイプ のオブジェクトに遭遇したらすぐに、Maybe<T>
その_value
プロパティを の代わりにシリアル化してくださいMaybe<T>
」、それも私の目標を達成します。