c# - ¿Por qué SerializationInfo no tiene métodos TryGetValue?
exception (2)
Bueno, nadie respondió "por qué", pero supongo que está dirigido a la EM ...
Mi implementación para cualquier persona en necesidad:
public static class SerializationInfoExtensions
{
public static bool TryGetValue<T>(this SerializationInfo serializationInfo, string name, out T value)
{
try
{
value = (T) serializationInfo.GetValue(name, typeof(T));
return true;
}
catch (SerializationException)
{
value = default(T);
return false;
}
}
public static T GetValueOrDefault<T>(this SerializationInfo serializationInfo, string name, Lazy<T> defaultValue)
{
try
{
return (T) serializationInfo.GetValue(name, typeof(T));
}
catch (SerializationException)
{
return defaultValue.Value;
}
}
}
Al implementar la interfaz ISerializable
en C #, proporcionamos un constructor que toma un objeto SerializationInfo
y luego lo consulta con varios GetInt32
, GetObject
, etc., para rellenar los campos del objeto que estamos tratando de deserializar.
Una razón importante para implementar esta interfaz, en lugar de simplemente usar el atributo [Serializable]
, es por la compatibilidad con versiones anteriores: si hemos agregado nuevos campos a la clase en algún momento, podemos detectar la SerializationException
lanzada por una versión serializada y más antigua de clase, y manejarlos de una manera apropiada.
Mi pregunta es la siguiente: ¿por qué tenemos que usar estas excepciones para lo que es, esencialmente, el flujo de control? Si estoy deserializando un gran número de clases que se guardaron hace algún tiempo, potencialmente cada campo faltante en cada clase producirá una excepción, lo que causará un rendimiento realmente malo.
¿Por qué la clase SerializationInfo
no proporciona métodos TryGetValue
que simplemente devolverían false
si la cadena de nombre no estuviera presente?
Puede iterar sobre los campos disponibles y usar el switch
, aunque ...
foreach(SerializationEntry entry in info) {
switch(entry.Name) {
...
}
}
O podrías usar protobuf-net ;-p