Question

J'utilise le BinaryFormatter et un MemoryStream pour sérialiser un objet, puis le stocker dans une base de données en tant que blob binaire. Je récupère ensuite les données de la base de données et deserialize en utilisant flux de BinaryFormatter et de la mémoire.

Cependant, lorsque je tente de désérialiser l'objet que je reçois souvent des exceptions étant levée. Notamment 'an object with the same key already exists' ou 'cannot convert string to int64'

Est-ce que quelqu'un a une idée pourquoi le deserialize chie sur? ou comment trouver ce dictionnaire objet est d'avoir des problèmes?

Mes fonctions sérialisation suivre ...

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 est un peu d'un monstre, mais il est marqué comme [sérialisable] et toutes les classes dans son arborescence d'objets sont également marqué comme [sérialisable]. Une partie de cette classe suit:

[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();
        }
}
Était-ce utile?

La solution

Je n'ai pas essayé dans les versions récentes du cadre, mais je pense que la règle de base est probablement encore bon, ne pas utiliser le BinaryFormatter avec des propriétés automatiques.

Le problème est, BinaryFormatter utilise les champs de support et non les propriétés pour faire sérialisation / désérialisation. Dans le cas des propriétés d'auto, le champ de stockage est générée au moment de la compilation. Et ce n'est pas garanti d'être le même à chaque fois. Cela pourrait signifier que vous désérialiser votre objet et vous ne recevez pas de retour exactement ce que vous mettez.

Pour en savoir plus lire ceci: Propriétés automatique et BinaryFormatter

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top