1

これが私の質問を示す自己完結型のサンプル プログラムです: https://gist.github.com/jennings/46c20733df559d02b9ad

私はMaybe<T>次のようなタイプを書いています:

public struct Maybe<T> : IXmlSerializable where T : class
{
    readonly T _value;
    //...
}

シリアライゼーションのこれら 2 つの目標のいずれかを達成できますか?

  1. 型のプロパティがシリアル化されている場合、 nullMaybe<T>の場合はプロパティをまったく発行しないでください(文字列プロパティにはこの動作があるようです)。_value

  2. _value の代わりに をシリアル化しMaybe<T>ます。

したがって、私の型を使用するクラスが次のようになっているとします。

public class AnyRandomObjectUsingMyType
{
    public Maybe<string> MaybeAString{ get; set; }
}

次に、MaybeaString._valuenull の場合、シリアル化するときにこれが必要です。

<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>」、それも私の目標を達成します。

4

1 に答える 1