이진 데이터 파일을 만들어야합니다. 한 번의 패스로 생성 할 수는 없지만 일부 데이터를 직렬화 한 다음 뒤로 이동하여 헤더에 오프셋을 써야합니다. 파일은 편안하게 메모리에 저장됩니다 (수 메가 바이트). BinaryWriter
을 사용하고 writer.Seek(x, SeekOrigin.Begin)
을 사용하여 오프셋 쓰기로 돌아갈 수 있습니까? 또는 파일을 쓰고 (그리고 나서 그것을 modyfing) 어떤 이점이 있습니까? 아니면 실제 차이가 없을 수도 있습니다.StreamWriter 또는 파일 쓰기를 통해 데이터를 수정 하시겠습니까?
답변
파일로 오프셋하는 대신 머리글을 나타내도록 압축 구조를 만들어야합니다. 구조를 채우고 파일의 시작 부분에 씁니다. 또한 한 번에 구조를 읽는 것이 더 쉬울 것입니다.
나머지 데이터가 직렬화 (파일/스트림 작성기에 기록)되기 전에 헤더에 쓸 값을 모르겠습니다. 우리가 "write offset"을 "filled filled struct"로 변경하면 질문은 여전히 유효합니다. – tomash
파일에 빈 구조를 작성하십시오. 그런 다음 오프셋을 구조에 기록하는 '물건'을 모두 작성하십시오. 그런 다음 구조체를 다시 작성하십시오 (오프셋 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 |
길이 매개 변수는 청크의 총 길이를 인코딩 한 후 어떤 원시 바이트 :
대신에, 나는 예를 들어, 데이터를 순차적으로 팩 것이다 직렬화되는 실제 객체에 대한 것입니다.
얼마를 찾고 싶습니까? 필자가 작성자를 위해 사용하는 기본 스트림이 FileStream이 아닌 MemoryStream 인 경우 더 빠를 것이라고 생각합니다. 이렇게하면 디스크 액세스가 줄어들고 단일 패스로 완료된 스트림을 디스크에 기록 할 수 있습니다. – havardhu