实现ISerializable时,您可以编写此类代码来执行自定义反序列化...
(注意:这是一个简单的例子,并不保证自定义反序列化)。
protected ClientInformation(SerializationInfo info, StreamingContext context)
{
_culture = (string)info.GetValue("Culture", typeof(string))
}
GetValue方法需要您希望反序列化的类型,根据intellisense帮助执行以下操作
“如果存储的值无法转换为此类型,系统将抛出System.InvalidCast异常”
这是否意味着在我的示例语句中正在执行两个强制转换?
此外,添加此类型参数的重点是什么,因为如果我编写以下内容
_culture = info.GetValue("Culture", typeof(string))
...无论如何都不会编译,因为你“不能隐式地将类型'对象'转换为'字符串'”。所以这意味着我必须无论如何转换对象,因此如果转换无效,我将在任何情况下通过我的自己的转换获得InvalidCastException。
它将出现两个强制转换在这里发生,同样在任何情况下错误只能在运行时发生(没有编译类型检查可以通过泛型实现),除非有人知道为什么会发生这种情况?
更新:可能是在幕后使用“是”运算符来检查类型是预期的吗? “是”会自动尝试投射吗?
答案 0 :(得分:0)
如果我们查看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);
}