可序列化的反序列化性能



在实现isserializable时,您可以编写这样的代码来执行自定义反序列化…

(注意:这是一个简单的例子,不需要自定义反序列化)。

protected ClientInformation(SerializationInfo info, StreamingContext context)
{
    _culture = (string)info.GetValue("Culture", typeof(string))
}

需要为GetValue方法指定您希望反序列化的类型,根据智能感知帮助,它执行以下操作

"如果存储的值不能转换为该类型,系统将抛出system。InvalidCast例外"

这是否意味着在我的示例语句中执行了两次强制转换?

另外,添加这个类型参数有什么意义,因为如果我写下面的

_culture = info.GetValue("Culture", typeof(string))

…无论如何,这都不会编译,因为你"不能隐式地将类型'object'转换为'string'"。所以这意味着我无论如何必须强制转换对象,因此如果强制转换无效,在任何情况下我都会通过我的自己的强制转换获得InvalidCastException。

它会出现两个类型转换发生在这里,同样在任何情况下,错误只能发生在运行时(没有编译类型检查,可以通过泛型实现),除非有人知道为什么会发生这种情况?

更新:可能在幕后使用了"is"操作符来检查类型是否符合预期?"is"会自动尝试强制转换吗?

如果我们看一下GetValue的实现,似乎对象本身没有被强制转换,但至少发生了一次强制转换(Type to RuntimeType)。

和更多的检查,认为你的对象是否被强制转换不那么重要,据我所知。

public object GetValue(string name, Type type)
{
    Type type3;
    if (type == null)
    {
        throw new ArgumentNullException("type");
    }
    RuntimeType castType = type as RuntimeType;
    if (castType == null)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
    }
    object element = this.GetElement(name, out type3);
    if (RemotingServices.IsTransparentProxy(element))
    {
        if (RemotingServices.ProxyCheckCast(RemotingServices.GetRealProxy(element), castType))
        {
            return element;
        }
    }
    else if ((object.ReferenceEquals(type3, type) || type.IsAssignableFrom(type3)) || (element == null))
    {
        return element;
    }
    return this.m_converter.Convert(element, type);
}

相关内容

  • 没有找到相关文章

最新更新