ISerializable производительность десериализации - PullRequest
1 голос
/ 29 ноября 2011

При реализации ISerializable вы пишете такой код для выполнения пользовательской десериализации ...

(Примечание: это тривиальный пример и не требует пользовательской десериализации).

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

Для метода GetValue требуется тип, который вы хотите десериализовать, который в соответствии с помощью intellisense выполняет следующее

"Если сохраненное значение не может быть преобразовано в этот тип, система выдаст Систему.Исключение InvalidCast "

Означает ли это, что в моем примере оператора выполняются два приведения?

Кроме того, какой смысл добавлять этот параметр типа, потому что если я напишу следующее

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

... это все равно не скомпилируется, так как вы «не можете неявно преобразовать тип« объект »в« строку »».Таким образом, это означает, что я должен привести объект в любом случае, и поэтому, если приведение недействительно, я получу исключение InvalidCastException через мое собственное приведение в любом случае.

Это будет Появляется , что здесь происходит два приведения, а также, в любом случае, ошибка может произойти только во время выполнения (без проверки типа компиляции, которая могла бы быть достигнута с помощью обобщений), если никто не знает причину, почему это происходит?

Обновление: Может быть, за кадром используется оператор "is" для проверки типа, что ожидается?"Is" автоматически пытается разыграть?

1 Ответ

0 голосов
/ 29 ноября 2011

Если мы посмотрим на реализацию 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...