다음과 같은 문제가 있습니다. 디스크의 단일 파일에 객체 스트림을 직렬화 (바이너리)해야합니다. 직렬화 부분은 문제가되지 않습니다. 추가 모드에서 스트림을 열고 .Net의 BinaryFormatter Serialize 메서드를 사용하면 작업이 완료됩니다. 이 접근 방식의 문제점은이 스트림을 BinaryFormatter의 deserialize 함수에 제공 할 수 없다는 것입니다.이 함수에는 직렬화 한 객체의 단일 인스턴스가 들어 있지 않습니다.이진수 (De) 1 파일에 객체 스트림 직렬화
이 문제에 대한 일반적인 해결책이 있습니까? 주어진 스트림에 직렬화 된 모든 객체는 같은 유형이므로 적어도 비 직렬화되어야 할 것이 무엇인지 파악할 필요가 없습니다. 이는 주어진 것입니다. 그러나이 방법은 나에게이 방법을 제안하지 않는 것 같습니다.
응답에 따라 명확한 설명 : 클 것으로 예상된다 전송 객체의 수와는 메모리에 모두로드 할 필요 디스크에 플러시로 (래퍼 컬렉션 그들 모두를 유지하는 것이 불가능하다 -> 새로 추가 -> 디스크로 플러시). 당신은 하나의 객체를 직렬화 할 때
- 은 일반적으로 당신이 포함 된 파일을 얻을 :
내가 만드는 오전 것이 들어있는 파일입니다
- [오브젝트] :
[개체] [개체] [개체] [개체] ... [개체]
그리고 개별 Object 인스턴스를 deserialize해야합니다.
미리 감사드립니다.
답변 :
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
경우 BinaryFormatter는 하나 개의 객체를 직렬화합니다 : 대답은 (충분한 명확성)이 스레드에서 언급하지만, 명시 적으로 언급되지 않습니다 때문에, 나는 내가 여기 상태 것이다 생각 한 번에 원하는대로 :) fileStream.Length 속성을 캐싱 할 수 있습니다. 속성을 호출 할 때마다 길이가 다시 계산되어 나타나면 작업 속도가 느려지는 것 같습니다. 나는이 질문을 게시하기 전에 시도한 것이 처음에는 작동하지 않는 이유를 모르지만 지금은 완벽하게 작동합니다.
오브젝트는 시스템의 수명 기간 동안 스트리밍되며, 매우 많은 수의 오브젝트가 예상된다 , 나는 내릴 필요가있다.래퍼 컬렉션에 보관하면 디스크에 플러시 할 때마다 메모리에 전체 파일을 저장하고 전체 파일을 다시 써야합니다. – United
첫 번째 제안은 다른 도서관 (일명 6 개월 + 합법적 인 승인 절차)이 필요하다는 이유로 계정에서 작동하지 않습니다. 두 번째 것은 흥미 롭습니다. 두 번째 대답은 콜렉션에있는 객체없이 한 파일에서 일련의 객체를 직렬화 해제하기 위해 정상적인 직렬화가 수행 된 것으로 보입니다. 내 테스트에서는 작동하지 않았고, 그래서 나는 더 깊이 조사하려고 노력할 것입니다. 아마도 그 질문에서 후속 조치를 취할 것입니다. – United