Исключение SerializationException не обработано: входной поток не является допустимым двоичным форматом. Начальное содержимое (в байтах) - PullRequest
1 голос
/ 18 сентября 2011

действительно застрял, любая помощь и / или комментарии будут с благодарностью!

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    class TheFile
    {
        //Version 1 serialiser, instance specific, so a bit of a pain

        public void SerializeObject(string filename, TheDocument document)
        {
            Stream stream = File.Open(filename, FileMode.Create);
            BinaryFormatter bFormatter = new BinaryFormatter();
            bFormatter.Serialize(stream, document);
            stream.Close();
        }
        public TheDocument DeSerializeObject(string filename)
        {
            TheDocument document;
            Stream stream = File.Open(filename, FileMode.Open);
            BinaryFormatter bFormatter = new BinaryFormatter();
            ***document = (TheDocument)bFormatter.Deserialize(stream);***
            stream.Close();
            return document;
        }
    }
}

Я получаю следующую ошибку: Входной поток не является допустимым двоичным форматом.Исходное содержимое (в байтах): 31-37-2F-30-39-2F-32-30-31-31-20-31-31-3A-30-36-3A ...

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Я недавно видел это где-то еще, и мне не удалось найти там объяснения либо .Код в том виде, в котором он представлен, выглядит так: должен быть в порядке (хотя он очень выиграл бы от нескольких using операторов, но они не сломали бы успех, поскольку вы вызываете .Close()).

Однако!Я также хотел бы предупредить, что IMO BinaryFormatter является , а не хорошим выбором для хранения в базе данных, поскольку это предполагает, что желательно прочитать его обратно в будущем .Тот факт, что BinaryFormatter зависит от типа, делает его очень хрупким при создании версии приложения.Любое из: создание новой версии приложения, переименование / добавление / удаление поля, изменение свойства на автоматически реализуемое свойство, изменение версии .NET, изменение платформы, ... может сделать ваши данные либо нечитаемымиили только для чтения путем добавления большого количества настраиваемого связующего кода.

I настоятельно предлагает вам рассмотреть возможность использования сериализатора на основе контракта вместо BinaryFormatter;любой из: DataContractSerializer (но не NetDataContractSerializer), XmlSerializer, JavascriptSerializer, JSON.Net.Если вам нужен двоичный файл для размера и производительности, то буферы протокола (с несколькими реализациями C #, включая protobuf-net) спроектированы (компанией Google), чтобы быть устойчивыми к версии, небольшими и быстрыми.Поскольку этот список также кроссплатформенный, это также означает, что ваши данные в безопасности, если, скажем, вы переключаете платформу на Java, Mono, WinRT (новая подсистема Windows 8), PHP или что-то еще.BinaryFormatter будет не работать на любом из них.

0 голосов
/ 18 сентября 2011

Успешно ли это?

var path = "...";
var doc = new TheDocument(...);

SerializeObject(path, doc);
var restored = DeserializedObject(path);

Assert.IsNotNull(restored); // NUnit check; use appropriate code

Слишком большой комментарий

...