Сериализация объекта Entity Framework, сохранение в файл, чтение и десериализация - PullRequest
7 голосов
/ 18 февраля 2011

Заголовок должен прояснить, что я пытаюсь сделать - получить объект Entity Framework, сериализовать его в строку, сохранить строку в файле, затем загрузить текст из файла и повторно выполнить его сериализацию в объект.Вуаля!

Но, конечно, это не работает, иначе меня бы здесь не было.Когда я пытаюсь выполнить повторную сериализацию, я получаю сообщение об ошибке «Входной поток не в допустимом двоичном формате», поэтому я явно чего-то упускаю.

Вот как я сериализую и сохраняю свои данные:

 string filePath = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteSavePath"];
 string fileName = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteFileName"];

        if(File.Exists(filePath + fileName))
        {
            File.Delete(filePath + fileName);
        }

        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, entityFrameWorkQuery.First());
        string str = System.Convert.ToBase64String(memoryStream.ToArray());

        StreamWriter file = new StreamWriter(filePath + fileName);
        file.WriteLine(str);
        file.Close();

Что дает мне большой бессмысленный текстовый файл, как и следовало ожидать.Затем я пытаюсь перестроить мой объект в другом месте:

            CustomerObject = File.ReadAllText(path);

            MemoryStream ms = new MemoryStream();
            FileStream fs = new FileStream(path, FileMode.Open);
            int bytesRead;
            int blockSize = 4096;
            byte[] buffer = new byte[blockSize];

            while (!(fs.Position == fs.Length))
            {
                bytesRead = fs.Read(buffer, 0, blockSize);
                ms.Write(buffer, 0, bytesRead);
            }

            BinaryFormatter formatter = new BinaryFormatter();
            ms.Position = 0;
            Customer cust = (Customer)formatter.Deserialize(ms);

И затем я получаю ошибку двоичного формата.

Я, очевидно, очень глупо.Но каким образом?

Приветствия, Мэтт

1 Ответ

3 голосов
/ 18 февраля 2011

Когда вы сохранили его, вы (по наиболее известным вам причинам) применили base-64 - но вы не применили base-64 при чтении.ИМО, просто брось base-64 полностью - и напиши прямо в FileStream.Это также избавляет от необходимости буферизовать его в памяти.

Например:

    if(File.Exists(path))
    {
        File.Delete(path);
    }
    using(var file = File.Create(path)) {
         BinaryFormatter ser = new BinaryFormatter();
         ser.Serialize(file, entityFrameWorkQuery.First());
         file.Close();
    }

и

     using(var file = File.OpenRead(path)) {
         BinaryFormatter ser = new BinaryFormatter();
         Customer cust = (Customer)ser.Deserialize(file);
         ...
    }     

в качестве примечания, вы можете обнаружить, что DataContractSerializerделает лучший сериализатор для EF, чем BinaryFormatter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...