2011-08-15 3 views
-1

byte[]에 액세스 할 수있는 작은 문제가 있습니다.
DB에서 얻은 이진 객체 (byte[])가 있는데이 객체를 읽을 수 있습니다. 길이에 상관없이 또는 Read() 메서드에 액세스 할 때마다 Cannot access a closed Stream 예외가 발생합니다.
코드에서 업데이트하고 db에 다시 저장해야하는 바이너리를 치료하는 가장 좋은 방법은 무엇입니까?C#의 기존 바이트 []에 어떻게 액세스합니까?

감사합니다.

편집 - 우리가 간소화하기 위해 만든 일반 데이터 객체에 대한 테스트 개체를 변환이 응용 프로그램에서 코드
, 그래서 이것은 데이터 객체입니다

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). 몇 가지 테스트를 만들고 맵핑 한 다음 저장하려고 시도합니다.

+5

코드를 공유 하시겠습니까? 아니면 스트림을 어떻게 읽었는지 제안해야합니까? – sll

+0

당신은'Stream'을 포함하고있는 것처럼 보이지만, "binary object"와 "byte []"에 대해서 이야기합니다 - 어떤 코드는 물을 뭉개지 않게 할 수 있습니다. –

+1

'byte []'는'Read()'메소드를 가지고 있지 않습니다. 실제로'Stream'을 가지고 있다면,이'Stream'을 어떻게 얻는 지 (그리고 언제 어떻게 조작하려고하는지) 명시 해주십시오. –

답변

0

그래서 문제는 Map() 방법에 의해 발생합니다 - 그것은 사용까지 내가 이해할 수로, 이후 :

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

스트림은 블록의 끝에서 처분했다. MemoryStream을 선언 한 다음 나중에 사용하여 변경했습니다.
아이디어를 주신 모든 분들께 감사드립니다 (이 코드를 모두 읽지는 않겠습니다)! :)

0

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

여기 있습니다. 데이터 객체에는 닫힌 Content 스트림이 있습니다.

결과 : 오류.

Reasno? 귀하의 질문과 관련없는 완전히 (!). 기본적으로 왜 데이터 처리에서 문제가 발생했는지 알아보십시오.

특정 시점 이후에 스트림을 사용할 수없고 객체의 사용자가이 지점을 지나치는 디자인 후 바 일 수 있습니다.

관련 문제