如何在二进制序列化类中存储任意二进制数据?

时间:2010-10-20 14:43:57

标签: c# exception serialization binary-data memorystream

在我的应用程序中使用C#/ .NET,我的主数据模型中有一系列表示“二进制”(而不是文本)内容的类。我有这样的继承设置:

alt text

基本上,抽象类BinaryContent包含存储任意二进制数据的MemoryStream。该数据是从磁盘上的文件中读取的。我计划存储的每种类型的二进制数据都是派生类型,例如ImageContentFontContent。那些派生类型将解释BinaryContent.Content中的二进制数据。例如,ImageContent将从MemoryStream创建一个BitmapImage(存储在ImageSource中)。 FontContent当然会从BinaryContent.Content创建一种字体。我选择这种做法是因为我希望能够基本上存储内容文件的副本(即图像),而不必依赖于磁盘上特定位置的文件。

我还使用二进制序列化将这些类的实例存储在“项目文件”中。我这样做基本上将所有东西“打包”在一起。看来,当我尝试反序列化MemoryStream时,我遇到了麻烦。当我从MemoryStream创建图像时会发生问题。在反序列化后运行以下方法时,会发生FileFormatexception

private void RefreshImageFromContent()
{
    BitmapImage image = null;
    if (Content != null &&
        Content.Length != 0L)
    {
        image = new BitmapImage();
        image.BeginInit();
        image.StreamSource = Content;
        image.EndInit(); //throws FileFormatException
    }

    Image = image;
}

FileFormatException消息是: “图像无法解码。图像标题可能已损坏。” 内部异常:“来自HRESULT的异常:0x88982F61”

我现在最好的猜测是,在序列化或反序列化期间,BinaryContent.Content中的数据会发生变形。

这导致我提出两个问题。

  1. 有没有人有任何建议来解决这个问题?
  2. 是否有人有其他建议的方法来存储将被(de)序列化的任意二进制数据?
  3. 请随时询问有关我的问题的任何说明。

    感谢。

1 个答案:

答案 0 :(得分:2)

content.Position的{​​{1}}是什么?

可能是流的位置未设置为开始(或流中的正确位置)。