Domanda

Sto usando il BinaryFormatter e un MemoryStream per serializzare un oggetto e poi conservarlo in un database come un blob binario. Ho poi recuperare i dati dal database e deserializzare utilizzando flusso BinaryFormatter e la memoria.

Tuttavia, quando si tenta di deserializzare l'oggetto Ho spesso eccezioni essere gettato. In particolare 'an object with the same key already exists' o 'cannot convert string to int64'

Qualcuno ha un'idea del perché il deserialize craps fuori? o come scoprire che cosa dizionario oggetti sta avendo problemi?

Le mie funzioni serializzare seguono ...

private byte[] SerializeUserData(UserData ud)
{
    byte[] data = null;
    using (MemoryStream ms = new MemoryStream())
    {
        ms.Seek(0, SeekOrigin.Begin);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, ud);
        data = ms.ToArray();
    }
    return data;
}

private UserData Deserialize()
{
    UserData ud = null;
    using (MemoryStream ms = new MemoryStream(mSession.BinarySession))
    {
        BinaryFormatter bf = new BinaryFormatter();
        ud = bf.Deserialize(ms) as UserData;
    }
    return ud; 
}

La classe UserData è un po 'di un mostro, ma è contrassegnato come [serializzabile] e tutte le classi nel suo albero degli oggetti sono anche contrassegnato come [serializzabile]. Una parte di questa classe segue:

[Serializable]
public class UserData
{
        public UserData() { Clear(); }
        public Guid Id { get; set; }

        public Account Account { get; set; }
        public List<Account> OldAccounts{ get; set; }

        public void Clear()
        {
          Account = null;
          OldAccounts = new List<Account>();
          Id = Guid.NewGuid();
        }
}
È stato utile?

Soluzione

Non ho provato questo nelle versioni più recenti del quadro, ma penso che la regola generale è probabilmente ancora buono, non utilizzare il BinaryFormatter con proprietà automatiche.

Il problema è che il BinaryFormatter utilizza i campi backing e non le proprietà per fare la serializzazione / deserializzazione. Nel caso delle proprietà auto, il campo di supporto viene generato in fase di compilazione. E non è garantito per essere lo stesso ogni volta. Ciò potrebbe significare che si deserializzare l'oggetto e non si ottiene indietro esattamente ciò che si mette.

Per maggiori leggere questo: Proprietà automatica e la BinaryFormatter

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