gpt4 book ai didi

c# - 当我使用 XmlSerializer 反序列化时,为什么我的 DbNull 不是单例?

转载 作者:太空狗 更新时间:2023-10-29 21:25:54 25 4
gpt4 key购买 nike

我一直假设 DbNull.value 是一个单例。因此你可以做这样的事情:

VB.NET:

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

C#:

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

但最近,我使用 XmlSerialiser 序列化了一个 DbNull 实例,突然间它不再是单例了。不过,类型比较操作(如 C# 的(obj 是 DBNull))工作正常。

代码如下:

[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.Value 是一个 static readonly 并且仅作为单个实例存在...当您反序列化时,序列化代码将创建一个新实例来自流中“数据”的 DBNull 类。由于 DBNull.Value 只是一个 DBNull 实例,因此序列化无法知道它是一个“特殊”实例。

注意:
出于同样的原因,如果您使用序列化然后反序列化的“单例”实例创建自己的类,您将获得完全相同的行为。尽管反序列化的实例与原始实例无法区分,但它们不会是同一实例

关于c# - 当我使用 XmlSerializer 反序列化时,为什么我的 DbNull 不是单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/948675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com