2013-05-20 4 views
0

스트림에서 직렬화 된 객체의 양을 가져 오려고합니다. 직렬화 및 비 직렬화에서 시작합니다. 나는 1과 그 금액 사이의 무작위 값을 만들기 위해 이것을하고 싶다.스트림에서 직렬화 된 객체의 양을 무작위로 선택하여 하나를 선택하십시오.

어떻게 할 수 있습니까?

현재 내 코드는 다음과 같습니다

Random rnd = new Random(); 
Stream stream = new FileStream("File.dat", FileMode.Open, FileAccess.Read, FileShare.Read); 
int randomNumber = rnd.Next(1, (int)stream.Length); 

그러나,이 파일의 약 3 직렬화 된 객체가있는 동안, stream.Length 값이 1000 이상이기 때문에 작동하지 않습니다.

나는 BinaryFormatter을 사용하여 직렬화를 수행합니다.

편집 : 나는 파일에 직렬화 된 개체가 다차원 배열 (int [,])이며 그 (것)들에 저장된 숫자가 있어야한다고 덧붙여 야합니다. 첫 번째 객체에는 숫자 1, 두 번째 객체에는 2 등이 있습니다. 미리 감사드립니다!

+1

직렬화 된 객체의 크기가 가변적 일 수 있으므로 처음 직렬화 될 때 어딘가에 해당 정보를 쓰지 않는 한 모든 객체를 직렬화 해제하지 않은 객체의 수를 결정할 수 없습니다. 그러나 객체가 고정 된 크기 (예 : 문자열이없는 경우)가 있다면 미리 직렬화 된 크기를 알면 해결할 수 있습니다. 객체 당 직렬화 된 크기로 파일 길이를 나눌 수 있습니다. –

+0

내가 어떻게 그럴 수 있니? 그것은 아주 좋은 생각이지만 그것을하는 방법을 잘 모르겠습니다. 개체를 serialize 할 때마다 1 씩 값을 늘리려고 생각했지만 응용 프로그램/프로젝트가 닫히고 나중에 다시 열릴 때 값이 유지됩니다. 편집 : 개체가 고정 크기가 아닙니다. – Fluppe

+0

예, 불행히도 객체가 고정 크기가 아닌 경우 모두를 비 직렬화하고 임의로 선택해야합니다. –

답변

0

알 수없는 크기의 목록에서 항목을 임의로 선택할 수 있지만이를 수행하려면 전체 목록을 검사해야합니다. 그러나 하나를 선택하기 위해 모든 항목을 메모리에 보관하지 않아도됩니다.

내 문서 Random Selection from Large Groups을 참조하십시오. 특히 "얼마나 많은지 알 수없는 경우"를 참조하십시오.