пб при открытии файла потом сохранение - PullRequest
0 голосов
/ 13 ноября 2011

Я создаю программу, которая шифрует / хэширует сообщения

У меня есть список, который содержит (дата, пользователь, шифрование, сообщение, зашифрованное сообщение) => Variables.oHistorique.Liste_historique.

Когда я просто шифрую сообщения, затем сохраняю, все работает нормально, когда я открываю этот файл, список содержит всю ожидаемую информацию, однако, если я открою файл, а затем повторно сохраню его (даже под новым именем), он будет пуст, список пустой. Я ценю всю помощь, которую я могу получить Спасибо

P.S Я проверил, и список заполняется при сохранении, но не при открытии вновь сохраненного файла

// когда я нажимаю открыть

 private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e)
    {
        FileDialog location = new OpenFileDialog();
        location.Filter = "Data Files (*.dat)|*.dat";
        location.FilterIndex = 1;
        result = location.ShowDialog();

        if (result == DialogResult.OK)
        {
          dataGridView1.Rows.Clear();
          Variables.oHistorique = (CHistorique)oSerialize.DeSerializeObject(location.FileName);
          for (int i = 0; i < Variables.oHistorique.Liste_historique.ToArray().Length; i++)
          {
              dataGridView1.Rows.Add(Variables.oHistorique.Liste_historique[i].Date, Variables.oHistorique.Liste_historique[i].User, Variables.oHistorique.Liste_historique[i].Type, Variables.oHistorique.Liste_historique[i].Chaine, Variables.oHistorique.Liste_historique[i].ChaineCrypt);
          }
          dataGridView1.CurrentCell = null;  
        }
    }

// Когда я нажимаю сохранить:

private void sauvgarderToolStripMenuItem_Click(object sender, EventArgs e)
    {
        FileDialog location = new SaveFileDialog();
        location.Filter = "Data Files (*.dat)|*.dat";
        location.FilterIndex = 1; 
        result = location.ShowDialog();

        if (result == DialogResult.OK)
        {   
        oSerialize.SerializeObject(CHistorique.GetInstance(),location.FileName);
        }

    }

// Вот мой класс Сериализация

 class CSerialize
{

    private static CSerialize Instance;

    private CSerialize()
    {

    }

    public void SerializeObject(object o, string file)
    {
        Stream stream = File.Open(file, FileMode.Create);
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(stream, o);
        stream.Close();
    }
    public object DeSerializeObject(string file)
    {
        Object o;
        Stream stream = File.Open(file, FileMode.Open);
        BinaryFormatter b = new BinaryFormatter();
        o = b.Deserialize(stream);
        stream.Close();
        return o;
    }
    public static CSerialize GetInstance()
    {
        if (Instance == null)
        {
            Instance = new CSerialize();
        }
        return Instance;
    }
}

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Из предоставленного вами кода я вижу, что при десериализации объекта вы присвоили его статическому полю класса Variables:

Variables.oHistorique = (CHistorique)oSerialize.DeSerializeObject(location.FileName);

, но при сериализации объекта при сохранении вы пытаетесь обратиться к нему через1004 *, который, как я могу догадаться, возвращает статическое поле класса CHistorique (потому что оно выглядит как шаблон синглтона).Но из предоставленного вами кода я не вижу никакой связи между Variables.oHistorique и CHistorique.GetInstance(), поэтому здесь может быть проблема.Вы просто сериализуете пустую переменную, поэтому файл пуст.

0 голосов
/ 13 ноября 2011

Я нашел ответ, который заменил

oSerialize.SerializeObject(CHistorique.GetInstance(),location.FileName);

на

oSerialize.SerializeObject(Variables.oHistorique,location.FileName);
...