2011-08-29 6 views
2

이진 데이터 파일을 만들어야합니다. 한 번의 패스로 생성 할 수는 없지만 일부 데이터를 직렬화 한 다음 뒤로 이동하여 헤더에 오프셋을 써야합니다. 파일은 편안하게 메모리에 저장됩니다 (수 메가 바이트). BinaryWriter을 사용하고 writer.Seek(x, SeekOrigin.Begin)을 사용하여 오프셋 쓰기로 돌아갈 수 있습니까? 또는 파일을 쓰고 (그리고 나서 그것을 modyfing) 어떤 이점이 있습니까? 아니면 실제 차이가 없을 수도 있습니다.StreamWriter 또는 파일 쓰기를 통해 데이터를 수정 하시겠습니까?

+2

얼마를 찾고 싶습니까? 필자가 작성자를 위해 사용하는 기본 스트림이 FileStream이 아닌 MemoryStream 인 경우 더 빠를 것이라고 생각합니다. 이렇게하면 디스크 액세스가 줄어들고 단일 패스로 완료된 스트림을 디스크에 기록 할 수 있습니다. – havardhu

답변

1

파일로 오프셋하는 대신 머리글을 나타내도록 압축 구조를 만들어야합니다. 구조를 채우고 파일의 시작 부분에 씁니다. 또한 한 번에 구조를 읽는 것이 더 쉬울 것입니다.

+0

나머지 데이터가 직렬화 (파일/스트림 작성기에 기록)되기 전에 헤더에 쓸 값을 모르겠습니다. 우리가 "write offset"을 "filled filled struct"로 변경하면 질문은 여전히 ​​유효합니다. – tomash

+0

파일에 빈 구조를 작성하십시오. 그런 다음 오프셋을 구조에 기록하는 '물건'을 모두 작성하십시오. 그런 다음 구조체를 다시 작성하십시오 (오프셋 0에서). –

0

나는 당신의 문제를 이해한다고 생각합니다. 당신은 프로그램의 다른 부분에서 객체를 직렬화하고 있습니다. 직렬화를 요청할 때까지 각 청크의 크기를 알지 못합니다. 모든 직렬화를 한번에 직렬화하고 싶지는 않습니다. 많은 기억.

파일 앞에 약간의 공간을두고 싶으면 이진 데이터를 청크로 작성하고 각 청크의 크기를 기록한 다음 돌아가서 각 청크의 시작 및 중단 위치를 나타내는 머리글을 작성하십시오.

당신이 묻는 솔루션은 합리적인 것처럼 보이지만 헤더 위치를 다시 찾으면 BinaryWriter가 덮어 쓸 것이라고 생각합니다. 따라서 헤더를 쓸 공간을 남겨 두려면 빈 바이트 패드를 작성해야합니다. - http://msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx#Y640

이제 문제는 얼마나 큰 헤더입니까? 얼마나 많은 빈 바이트를 씁니까? 아마도 직렬화해야하는 객체의 수에 의존 할 것입니다. 지금처럼 당신도 전에와 같은 문제가 있습니다. 당신이 덩어리 당이 어떤 특성이 옆에

| --------- Chunk 1 ----------|--------- Chunk 2 -----------| 
| length | name | ... | bytes | length | name | ... | bytes | 

길이 매개 변수는 청크의 총 길이를 인코딩 한 후 어떤 원시 바이트 :

대신에, 나는 예를 들어, 데이터를 순차적으로 팩 것이다 직렬화되는 실제 객체에 대한 것입니다.