SerializationException未处理:输入流不是有效的二进制格式。起始内容(以字节为单位)是

时间:2011-09-18 04:14:04

标签: c# serialization deserialization

真的卡住了,非常感谢任何帮助和/或评论!

我编写了一个数据库程序,需要能够将文件中的内容加载到列表中。所以基本上我正在尝试使用序列化和反序列化。发生错误的区域以粗体显示并用斜体显示:

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 个答案:

答案 0 :(得分:1)

我最近在其他地方看到了这个报道,我无法在那里找到 的解释。所呈现的代码看起来应该没问题(尽管它会从一些using语句中获益很多,但是它们不会打破成功案例,因为你正在调用{{1} })。

然而!我还要警告IMO .Close() 是数据库中存储的理想选择,因为这表明需要将其读回 in 未来。 BinaryFormatter依赖于类型的事实使得它在您对应用程序进行版本控制时非常脆弱。任何:创建新的应用程序版本,重命名/添加/删除字段,将属性更改为自动实现的属性,更改.NET版本,更改平台,... 可以制作您的数据不可读,或仅通过添加大量自定义活页夹代码可读。

强烈建议您考虑使用基于合同的序列化程序而不是BinaryFormatter;以下任意一项:BinaryFormatter(但不是DataContractSerializer),NetDataContractSerializerXmlSerializer,JSON.Net。如果你想要二进制文件的大小和性能,那么协议缓冲区(包括几个C#实现,包括protobuf-net)被设计(由谷歌)为版本容忍,小和快。由于该列表也是跨平台的,因此,如果您将平台切换到Java,Mono,WinRT(新的Windows 8子系统),PHP或其他任何东西,这也意味着您的数据是安全的。 JavascriptSerializer

答案 1 :(得分:0)

这会成功吗?

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

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

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

评论太大