Pregunta

Estamos trabajando en la liberación de la versión 2.0 de uno de nuestros productos, y queremos mantener la compatibilidad con los archivos de la base instalada de clientes Versión 1.0. He estado implementando ISerializable en la mayoría de los tipos en nuestra aplicación, y parecen tener con un obstáculo.

Tengo un tipo, vamos a llamarlo familia por el bien de la discusión

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged
{
    private string m_Address;
    //....
    private List<Name> m_People;
    //...
}

Esto es lo que se envía según la versión 1.0, en 2,0 cambiamos el nombre de clase a una persona, que es efectivamente el mismo, pero tiene un constructor ligeramente diferente, y obviamente un nombre diferente.

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged,
    ISerializabe
{
    private string m_Address;
    //....
    private List<Person> m_People;
    //...

    private Family(SerializationInfo info, StreamingContext context)
    {
        m_Address = info.GetString("m_Address");
        m_People = (List<Person>)info.GetValue("m_People", typeof(List<Person>));
    }

    // <<GetObjectData Method>>
}

Esto, obviamente, no hace el trabajo, el tipo de "Nombre" ya no está en el conjunto, por lo que añade una solución SerializationBinder a lo siguiente:

public sealed NamePersonSerializationBinder : SerializationBinder
{
    if (typeName.StartsWith("System.Collections.Generic.List`1[[Company.Name"))
        return typeof(List<Person>);
    else if (typeName.StartsWith("Company.Name"))
        return typeof(Person);
    else
        return null;
}

Esto funciona sobre todo, cuando deserializar el obeject, el aglutinante se llama, devuelve el tipo correcto, pero el constructor Deserialización en persona nunca se llama. No hay excepciones se están lanzando, Alguien tiene alguna idea?

¿Fue útil?

Solución

Fijo! Hay un tipo de base de la persona que estaba fallando para terminarlo de constructor, que estaba causando el constructor persona nunca se llama.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top