Как десериализовать BinaryFormatter

Я пытаюсь сериализовать свой MMF в файл, и вот код:

class MMF {
    private const string filename = @"c:\NFS";
    private long offset = 0;
    private long length = 194;
    private byte[] buffer;
    public MMF() {
        using (var mmf =
            MemoryMappedFile.CreateFromFile(filename, FileMode.OpenOrCreate, null, offset + length, MemoryMappedFileAccess.ReadWriteExecute)) {
            using (var accessor = mmf.CreateViewAccessor(offset, length, MemoryMappedFileAccess.ReadWriteExecute)) {
                buffer = new byte[194];
                /*FS fs = new FS();
                fs.Files[0].Path = "test";
                accessor.WriteArray<byte>(0, buffer, 0, (int)length);*/
                accessor.ReadArray<byte>(0, buffer, 0, (int)length);
                FS fs = (FS)ToObject(buffer);
                Console.WriteLine(fs.Files[0].Path);
                }
            }
        }
    private byte[] ToByteArray(object source) {
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream()) {
            formatter.Serialize(stream, source);
            return stream.ToArray();
            }
        }
    private object ToObject(byte[] source) {
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream(source)) {
            formatter.Deserialize(stream);
            return stream;
            }
        }
    }

В части десериализации я получаю сообщение об ошибке:

Необработанное исключение типа System.Runtime.Serialization.SerializationException произошло в mscorlib.dll

Дополнительная информация: двоичный поток «0» не содержит допустимого двоичного заголовка BinaryHeader. Возможные причины: неверный поток или изменение версии объекта между сериализацией и десериализацией.

Как правильно десериализовать файл? В чем моя ошибка?

спасибо


person cnd    schedule 16.08.2012    source источник
comment
ошибка на уровне строки форматирования.   -  person cnd    schedule 16.08.2012
comment
Выгрузите содержимое 192 байтов. Как сказал Одед, я подозреваю, что это все ноль. Также ничто из того, что есть на самом деле FS, не помогло бы. Кроме того, почему вы используете MMF, а не только FileStream?   -  person leppie    schedule 16.08.2012
comment
Я хочу использовать MMF вместо FileSystem, потому что я хочу создать действительно виртуальную файловую систему, а 192 байта не являются нулевыми.   -  person cnd    schedule 16.08.2012
comment
Без лишней информации сложно сказать. Это могло быть что угодно. У вас есть код где-нибудь в Интернете?   -  person leppie    schedule 16.08.2012
comment
да, конечно, github.com/nCdy/NENFS   -  person cnd    schedule 16.08.2012
comment
здесь github.com/nCdy/NENFS/blob/master/NEN_Server /FS/MMF.cs   -  person cnd    schedule 16.08.2012
comment
Получил это из ваших источников: pastebin.com/9mB84q42   -  person Dmitry Reznik    schedule 16.08.2012
comment
Я просто собирался предложить, что сделал @DmitriyReznik. Свободный ISerializable, и все должно быть в порядке.   -  person leppie    schedule 16.08.2012


Ответы (1)


Вы можете позволить MMF реализовать ISerializable и реализовать метод GetObjectData.

person André C. Andersen    schedule 16.08.2012