Eccezioni durante l'utilizzo di BinaryFormatter per deserializzare i miei dati serializzati
-
11-10-2019 - |
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();
}
}
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