2009-12-07 1 views
3

필자는 바이너리 직렬화를 파일로 만들려고하고 있었고 protobuf-net은 성능이 좋은 대안으로 보입니다. 나는 시작하는 데 조금 갇혀있다. 내가 속성을 사용하지만 .proto 파일을 이동 말인가 아니에요 실제 직렬화에서 클래스의 정의를 분리 할 때문에, 나는 아래로 객체의 구조를 가지고Protobuf-net을 사용하여 객체 목록을 serialize

message Post { 

    required uint64 id = 1; 

    required int32 userid = 2; 

    required string status= 3; 

    required datetime created = 4; 

    optional string source= 5; 

} 

(내 생각) (datetime이 유효합니까? 아니면 틱을 int64로 사용해야합니까?)

하지만 protogen을 사용하는 방법에 대해 고민하고 파일의 IEnumerable을 직렬화하여 다시 읽습니다. 컴퓨터가 종료되면 다시 DateTime

+0

안녕하세요 Mattias, 여기에는 비판적인 의도가 없지만 매우 적극적인 프로토콜 버퍼 포럼보다는 여기에 왜 묻는 지 궁금합니다. http://groups.google.com/group/protobuf?pli=1 ? – BillW

+5

@BillW - 괜찮습니까? 그것은 프로그래밍 질문이며, 저자는 여기에서 꽤 활동적입니다. 저는 믿습니다. –

답변

2

를 직렬화하는 동안 같은 어떤 도움

또 다른 관련 질문을 주시면 감사하겠습니다,이 는 표준 ..., 손상된 바이너리 파일을 검출하기위한 어떤 모범 사례가없는입니다 프로토 타입; protobuf-net이 DateTime에 사용하는 내부 직렬화와 일치하도록 의도 된 내 라이브러리에 BCL.DateTime (또는 비슷한)을 추가했으나 아직 (아직) 코드 생성기를 업데이트하지 않은 것이 확실합니다. 특별한 경우로 이것을 탐지하는 것. 최대의 휴대 성을 원한다면 "진드기"스타일의 접근 방식이 실용적 일 수 있습니다. 알려주십시오 ...

파일에 일련 번호를 다시 지정하면 - Getting Started 예와 거의 같아야하지만 protobuf-net은 재구성 할 수있는 데이터로 작업하기를 원합니다. 단지IEnumerable<T>이 문제를 일으킬 수 있습니다. - IList<T>은 괜찮습니다. (재구성 할 때 콘크리트 유형으로 기본 설정은 List<T>입니다.)

손상 - ​​아마도 SerializeWithLengthPrefix을 사용합니다. 그러면 메시지 경계 (EOF처럼 발견 할 수없는 곳)에서 문제를 감지 할 수 있습니다. 이것은 (이름에서 알 수 있듯이) 길이를 먼저 씁니다. 따라서 충분한 데이터가 있는지 여부를 알 수 있습니다 (DeserializeWithLengthPrefix 경유). 또는 파일의 첫 번째 [n] 바이트를 해시/체크섬으로 예약하십시오. 이 공백을 쓴 다음 데이터를 쓰고 해시/체크섬을 계산하고 시작을 덮어 씁니다. 비 직렬화 중에 확인하십시오. 훨씬 더 많은 작업.

+0

안녕하세요. 내가 궁금한 것은 Post의 목록에 대한 .proto 파일 선언 (속성이 아니라)에 대한 것이 었습니다. 그리고 protogen과 생성 된 클래스를 사용하는 방법에 대해 궁금합니다. havent는 그 예를 보았습니다. 흠, 아마도 나는 더미를 넣을 수 있습니다. 항상 파일에 특정 값이있는 게시물을 넣고, 그렇지 않으면 마지막 백업으로 폴백합니다. – Homde