私はXmlSerializerをを使用して、それをデシリアライズするときなぜDbNullにシングルトンではないでしょうか?

StackOverflow https://stackoverflow.com/questions/948675

質問

私はいつもDBNull.Valueをシングルトンであると仮定してきました。こうしてあなたは、このようなことを行うことができます:

VB.NETます:

If someObject Is DbNull.Value Then
    ...
End if

のC#ます:

If (someObject == DbNull.Value)
{
    ...
}

しかし、最近、私はXmlSerialiserを使用してDbNullにインスタンスをシリアライズし、突然、それはもはやシングルトンではなかったです。タイプの比較演算は(C#の(objががDBNullであるように))しかしOK動作します。

コードは次のとおりです。

[Serializable, System.Xml.Serialization.XmlInclude(typeof(DBNull))]
public class SerialiseMe
{
    public SerialiseMe() { }

    public SerialiseMe(object value)
    {
        this.ICanBeDbNull = value;
    }
    public Object ICanBeDbNull { get; set; }
}

public void Foo()
{
    var serialiseDbNull = new SerialiseMe(DBNull.Value);
    var serialiser = new System.Xml.Serialization.XmlSerializer(typeof(SerialiseMe));
    var ms = new System.IO.MemoryStream();
    serialiser.Serialize(ms, serialiseDbNull);
    ms.Seek(0, System.IO.SeekOrigin.Begin);
    var deSerialisedDbNull = (SerialiseMe)serialiser.Deserialize(ms);

    // Is false, WTF!
    var equalsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull == DBNull.Value;
    // Is false, WTF!
    var refEqualsDbNullDeserialised = object.ReferenceEquals(deSerialisedDbNull.ICanBeDbNull, DBNull.Value);
    // Is true.
    var convertIsDbNullDeserialised = Convert.IsDBNull(deSerialisedDbNull.ICanBeDbNull);
    // Is true.
    var isIsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull is DBNull;

}

なぜこのような場合でしょうか?そして、それはどのように起こるのでしょうか?そして、それはおそらく、他の静的フィールドで発生することができますか?

PS:私は、VBのコードサンプルは、基準比較とC#のはObject.equalsを呼び出してやっている認識しています。どちらも、がDBNullと同じ動作をします。私は通常、VBで動作します。

役に立ちましたか?

解決

DBNull.Valuestatic readonlyであり、唯一のあなたのデシリアライズ、シリアライズコードはストリームで「データ」からクラスDBNullの新しいインスタンスを作成することになるとき...単一インスタンスとして存在するが。 DBNull.Valueは、単にDBNullインスタンスであるので、それは特別な "インスタンスであることを知ることがシリアライズのための方法はありません。

注:
あなたはその後、シリアライズと「シングルトン」のインスタンスを使用して独自のクラスを作る場合にも、同じ理由で、あなたは正確に同じ動作を取得するデシリアライズ。直列化復元インスタンスは元のインスタンスと区別がつかないだろうが、彼らはの

の同じインスタンスではありません

他のヒント

あなたのC#のコードは.Equalsメソッドを呼び出す等しくありません。アウトを使用すると、

を置換した場合、実際にかなり確信してそれをイムをテストしました
someObject == DbNull.Value

タグ付き
DbNull.Value.Equals(someObject) 

それはあなたに期待される結果を与えるだろう。等価演算子とequalsメソッドのいくつかの内部について見てみましょう: エリックLippertsブログ記事その対象での

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top