2011-07-26 8 views
6

Tôi có Bộ đệm Giao thức để ghi dữ liệu.Ghi tăng dần đối tượng Bộ đệm Giao thức

message Message { 
    required double val1 = 1; 
    optional int val2 = 2; 
} 

message BigObject { 
    repeated Message message = 1; 
} 

Tôi nhận được thư một giây. Chúng được lưu trữ trong bộ nhớ với BigObject của tôi và chúng được sử dụng cho một số nhiệm vụ. Nhưng đồng thời tôi muốn lưu trữ các tin nhắn đó trong tập tin để sao lưu trong trường hợp sự cố ứng dụng. Viết đơn giản BigObject mỗi lần sẽ lãng phí thời gian. Và tôi cố gắng tìm cách để chỉ viết các tin nhắn được thêm vào kể từ lần cuối cùng ghi vào tập tin. Có cách nào cho điều đó không?

Trả lời

3

Protobuf là định dạng nối thêm và bố cục của bạn là lý tưởng cho điều này. Chỉ cần mở tệp của bạn được đặt ở cuối và bắt đầu bằng một (trống) BigObject mới. Thêm/tuần tự hóa chỉ Message ví dụ mới và ghi vào tệp (từ cuối trở đi).

Bây giờ, nếu bạn phân tích cú pháp tệp của mình từ đầu, bạn sẽ nhận được một đơn BigObject với tất cả các trường hợp Message (cũ và mới).

Bạn thực sự có thể làm điều này bằng cách đăng nhập mỗi cá nhân Message như nó đến, miễn là bạn bọc nó trong một BigObject mỗi lần, tức là trong pseudo-code

loop { 
    msg = await NextMessage(); 
    wrapper = new BigObject(); 
    wrapper.Messages.Add(msg); 

    file = OpenFileAtEnd(); 
    wrapper.WriteTo(file); 
    file.Close(); 
} 
+0

làm bạn có nghĩa là msg.WriteTo (tập tin) ; ? –

+0

hmm .. khi tôi đã làm 'msg-> SerializeToZeroCopyStream (đầu ra);' 100x lần kích thước tệp là 3800 nhưng khi tôi đã làm 'bigObject-> SerializeToZeroCopyStream (đầu ra);' kích thước tệp là 4000 bitObject chứa 100 msg. vì vậy tôi nghĩ chúng tôi đã bỏ lỡ điều gì đó. –

+0

oh. tôi hiểu, bạn nói đúng. một bigObject với 10 đối tượng msg ở định dạng nhị phân giống như 10 đối tượng bigObject với 1 msg mỗi. –