Domanda

Non ho dati che sono stati memorizzati utilizzando la serializzazione binaria per la seguente classe:

[Serializable]
public abstract class BaseBusinessObject
{
    private NameValueCollection _fieldErrors = new NameValueCollection();

    protected virtual NameValueCollection FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

A un certo punto, la classe è stato cambiato a questo:

[Serializable]
public abstract class BaseBusinessObject
{
    private Dictionary<string, string> _fieldErrors = new Dictionary<string, string>();

    protected virtual Dictionary<string, string> FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

Questo sta causando problemi di deserializzazione vecchi dati.

Il mio primo pensiero è stato quello di implementare ISerializable, ma questa classe ha numerose proprietà così come centinaia di ereditare classi che avrei dovuto implementare questa per pure.

Vorrei cambiare sia i vecchi dati per abbinare la struttura attuale durante la deserializzazione o di avere un modo pulito di aggiornare i vecchi dati.

È stato utile?

Soluzione

Aggiungere il nuovo _fieldErrors con un nome diverso, diciamo _fieldErrors2, e renderlo [Optional] . Quindi implementare un [OnDeserialized] metodo che copia i dati da _fieldErrors a _fieldErrors2 (se presente), e cancella _fieldErrors.

Altri suggerimenti

Se i dati vengono utilizzati solo internamente, il mio primo pensiero sarebbe quello di scrivere del semplice codice usa e getta a de-serializzare i dati binari utilizzando il vecchio "NameValueCollection", la mappa ad un Dictionnary e ri-serializzare esso. Anche se ci vorrà qualche giorno per elaborare tutti i dati, non sembra vale la pena di implementare una patch sul nuovo codice per supportare i vecchi dati.

Anche se non è solo utilizzato internamente, un importatore sembra il modo più semplice per andare.

L'aggiunta di un buon consiglio di OlivierD, io suggerirei di definire entrambe le classi, ma inizialmente tenta di deserializzare come la versione corrente. Nel vostro blocco catch, deserializzare come la versione precedente, quindi aggiornarlo a quella attuale e salvarlo di nuovo. Quando non esistono istanze della versione precedente, è possibile rimuovere il codice.

Dopo aver esaminato alcune opzioni, ho fatto le seguenti conclusioni:

Idealmente vorrei essere in grado di accedere al valore dal NameValueCollection originale e manualmente convertirlo in Dictionary<string, string>. L'unico modo per farlo sarebbe quello di implementare ISerializable, ma questo posto due questioni principali: corrispondenza fino alla denominazione dei dati legacy e l'inclusione di logica serializzazione per tutte le classi che ereditano (di cui ci sono centinaia).

In effetti, questo mi ha messo in un vicolo cieco. Per fortuna, sono stato in grado di determinare che questo campo è davvero utilizzato solo come una sintesi degli errori di validazione dei form e non deve essere sempre serializzato in primo luogo, quindi ho escluso dalla serializzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top