在实现ISerializable时,可以编写这样的代码来执行自定义反序列化.
(注意:这是一个微不足道的例子,不需要定制反序列化)。
protected ClientInformation(SerializationInfo info, StreamingContext context)
{
_culture = (string)info.GetValue("Culture", typeof(string))
}需要对GetValue方法进行反序列化的类型,根据intellisense帮助执行以下操作
“如果无法将存储的值转换为此类型,系统将引发System.InvalidCast异常”
这是否意味着在我的示例语句中正在执行两个强制转换?
此外,添加此类型参数的意义是什么,因为如果我编写以下内容
_culture = info.GetValue("Culture", typeof(string))..。这无论如何都不会编译,因为“不能隐式地将'object‘类型转换为'string'”。因此,这意味着无论如何我必须对对象进行强制转换,因此,如果强制转换无效,无论如何,我将通过自己的强制转换获得一个InvalidCastException。
这里似乎发生了两个转换,同样,在任何情况下,错误只能在运行时发生(不能通过泛型实现编译类型检查),除非有人知道发生这种情况的原因?
更新:可能是幕后的一个" is“操作符被用来检查类型是什么是预期的?“是”自动尝试转换吗?
发布于 2011-11-29 15:14:06
如果我们查看GetValue的实现,似乎对象本身并没有被抛出,但至少发生了一次强制转换(Type )。
据我所知,还有更多的检查,认为你的目标是否不那么重要。
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);
}https://stackoverflow.com/questions/8313023
复制相似问题