2012-03-10 3 views
2

파일에 100000의 객체 배열을 직렬화해야하지만, 비 직렬화 중에 읽기 당 1000 개의 객체 척을 읽고 싶습니다.슬리 프/프로토 How to?

현재 C#의 Thrift 또는 Protocol Buffer에 대한 좋은 예제는 없습니다. 누군가 나를 도울 수 있습니까?

감사

답변

2

음 protobuf-CSHARP 포트는 MessageStreamIterator 당신이 순서를 작성하고 다음 역 직렬화로 반복 할 수 MessageStreamWriter있다. 그런 다음 LINQ to Objects를 사용하여 원하는대로 1000 개를 얻을 수 있습니다.

1

protobuf-net을 사용하는 경우 IEnumerable<T> 구현을 제공하는 DeserializeItems (또는 이와 유사한 방법)가 있으며 버퍼링되지 않으므로 원하는대로 항목을 소비 할 수 있습니다 (LINQ "Take"등에 적합). 원래 직렬화 된 객체가 객체의 목록/배열 인 경우 완벽하게 작동합니다. 또한 과도하게 읽지 않고 스트림에서 하나의 객체를 읽는 DeserializeWithLengthPrefix 메소드와 완벽하게 호환됩니다 (길이 접두어가 붙은 로그로서 배열/항목 목록이 직렬화되는 경우 인 경우) 이 허용됩니다. 당신은 "while"루프에서 같은 일을 할 수 있습니다. 좀 더 완벽한 예제를 원한다면 알려주십시오.

예 :

// write 
YourType[] array = ...; 
Serializer.Serialize(destination, array); 

// read 
List<YourType> batch = new List<YourType>(1000); 
foreach(var item in Serializer.DeserializeItems<YourType>(source)) { 
    batch.Add(item); 
    if(batch.Count == 1000) { 
     ProcessBatch(batch); 
     batch.Clear(); 
    } 
} 
if(batch.Count != 0) ProcessBatch(batch); 

또한 참고 프로토콜 버퍼 그래서 당신은 단지 파일의 끝에 추구하고 더 많은 데이터를 쓰기 시작 파일에 더 많은 데이터를 추가, 추가 가능하다.

+0

우리의 두 솔루션은 서로 호환됩니까? –

+0

빠른 응답을 보내 주셔서 감사합니다. 완전한 예제를 제공 할 수 있다면 좋을 것입니다. – tabreaz

+0

@Jon 광산은 아이템마다 : ** 선택적 ** 태그는 varint로, 일반적으로 "1", 다음 길이는 varint, 그리고 페이로드입니다. 그게 맞습니까? –