파일에 100000의 객체 배열을 직렬화해야하지만, 비 직렬화 중에 읽기 당 1000 개의 객체 척을 읽고 싶습니다.슬리 프/프로토 How to?
현재 C#의 Thrift 또는 Protocol Buffer에 대한 좋은 예제는 없습니다. 누군가 나를 도울 수 있습니까?
감사
파일에 100000의 객체 배열을 직렬화해야하지만, 비 직렬화 중에 읽기 당 1000 개의 객체 척을 읽고 싶습니다.슬리 프/프로토 How to?
현재 C#의 Thrift 또는 Protocol Buffer에 대한 좋은 예제는 없습니다. 누군가 나를 도울 수 있습니까?
감사
음 protobuf-CSHARP 포트는 MessageStreamIterator
당신이 순서를 작성하고 다음 역 직렬화로 반복 할 수 MessageStreamWriter
있다. 그런 다음 LINQ to Objects를 사용하여 원하는대로 1000 개를 얻을 수 있습니다.
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);
또한 참고 프로토콜 버퍼 그래서 당신은 단지 파일의 끝에 추구하고 더 많은 데이터를 쓰기 시작 파일에 더 많은 데이터를 추가, 추가 가능하다.
우리의 두 솔루션은 서로 호환됩니까? –
빠른 응답을 보내 주셔서 감사합니다. 완전한 예제를 제공 할 수 있다면 좋을 것입니다. – tabreaz
@Jon 광산은 아이템마다 : ** 선택적 ** 태그는 varint로, 일반적으로 "1", 다음 길이는 varint, 그리고 페이로드입니다. 그게 맞습니까? –