【问题标题】:How to deserialize BinaryFormatter如何反序列化 BinaryFormatter
【发布时间】:2012-08-12 22:42:07
【问题描述】:

我正在尝试将我的 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。可能的原因:无效的流或对象 序列化和反序列化之间的版本变化。

如何正确反序列化文件?我的错在哪里?

谢谢

【问题讨论】:

  • return formatter.Deserialize(stream);
  • 错误出现在 formatter.Deserialize(stream) 行级别
  • 转储 192 字节的内容。就像奥德说的,我怀疑这全是零。 FS 实际上是什么也没有什么帮助。另外,您为什么使用 MMF,而不仅仅是 FileStream
  • 我想使用 MMF 而不是 FileSystem 因为我想创建一个真正的虚拟文件系统,并且 192 字节不是空值。
  • 从您的来源得到这个工作:pastebin.com/9mB84q42

标签: c# serialization memory-mapped-files binaryformatter


【解决方案1】:

您可能希望让 MMF 实现 ISerializable 并实现 GetObjectData 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多