访问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
会抛出异常。我在创建一些测试,映射它并尝试保存它之后得到它。
答案 0 :(得分:0)
data.Content.Read(testData,0,(int)data.Content.Length);
我们走了。数据对象具有已关闭的内容流。
结果:错误。
Reasno?完全(!)与您的问题无关。基本上找出原因/数据处理中存在的问题。
可能是一个设计fubar,其中流在某个点之后不可用,并且该对象的你的圣人已超过这一点。
答案 1 :(得分:0)
所以问题是由Map()
方法引起的 - 据我所知,因为它使用了:
using (var stream = new MemoryStream())
{ ... }
在块的末尾处理流。将其更改为声明MemoryStream
然后再使用它
感谢所有想过的人(不提及阅读所有这些代码)! :)