如何在C#中访问现有的byte []?

时间:2011-08-15 12:46:42

标签: c# bytearray

访问byte[]时遇到一个小问题:
我有一个二进制对象(byte[]保存到mssql db),我从数据库中获取,我想阅读它。每当我访问它,它的长度或其Read()方法时,我都会得到一个Cannot access a closed Stream异常 如果必须在代码中更新二进制文件并将其再次保存到数据库,那么处理二进制文件的最佳方法是什么?

感谢。

编辑 - 代码
在这个应用程序中,我们将测试对象转换为我们为简化而创建的通用数据对象,因此这是数据对象:

public class DataObject
{
    public Stream Content { get; set; }
    public Descriptor Descriptor { get; set; }
}

描述符仅包含元数据(目前只有名称和描述字符串),我认为并不相关。 测试更复杂,我将首先将映射添加到数据对象中。提到的序列化程序是NetDataContractSerializer

public DataObject Map(Test test)
{
    using(var stream = new MemoryStream())
    {
        Serialize(test, stream);
        return new DataObject { Content = stream, Descriptor = test.Descriptor };
    }
}
 private void Serialize(Test test, MemoryStream stream)
 {
    serializer.WriteObject(stream, test);
    stream.Flush();
    stream.Position = 0;
 }

反之亦然:

public Test Build(DataObject data)
{
      using (var stream = data.Content)
      {
           var test = Deserialize(stream);
           test.Descriptor = data.Descriptor;
           return test ;
      }
}
private Test Deserialize(Stream stream)
{
    return serializer.ReadObject(stream) as IPythonTest;
}  

编辑II - 尝试更改测试内容:
这是我第一次尝试处理流,我不确定我做得对,所以我先解释一下我想要做什么:data字段中的信息应该保存到测试的数据对象中。

private static void UpdateTestObject(DataObject data, Test test)
{
    var testData = new byte[data.Content.Length];
    data.Content.Read(testData, 0, (int) data.Content.Length);
    test.TestObject = testData;
}

访问data.Content时,UpdateTestObject会抛出异常。我在创建一些测试,映射它并尝试保存它之后得到它。

2 个答案:

答案 0 :(得分:0)

  

data.Content.Read(testData,0,(int)data.Content.Length);

我们走了。数据对象具有已关闭的内容流。

结果:错误。

Reasno?完全(!)与您的问题无关。基本上找出原因/数据处理中存在的问题。

可能是一个设计fubar,其中流在某个点之后不可用,并且该对象的你的圣人已超过这一点。

答案 1 :(得分:0)

所以问题是由Map()方法引起的 - 据我所知,因为它使用了:

using (var stream = new MemoryStream())
{ ... }

在块的末尾处理流。将其更改为声明MemoryStream然后再使用它 感谢所有想过的人(不提及阅读所有这些代码)! :)