2009-06-26 37 views
15

Tôi bắt đầu di chuyển một cơ chế tuần tự hóa tùy chỉnh sang Protocol Buffers là gì. Một kiểu dữ liệu sẽ được sử dụng đặc biệt thường xuyên là BigDecimal.Cách tiếp cận tốt nhất để tuần tự hóa BigDecimal/BigInteger thành ProtocolBuffers

Có ai biết cách tốt để tuần tự hóa điều này trong Bộ đệm giao thức không? Quá trình tuần tự hóa hiện tại của chúng ta sử dụng BigDecimal.toPlainString() để tuần tự hóa, và BigDecimal (String) mới cho deserialization - Tôi giả sử có một cách tốt hơn.

tôi đoán là để xác định một BigDecimal như:

message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

Nhưng tôi không quá chắc chắn làm thế nào để xác định BigInteger - có lẽ sử dụng phương pháp của nó toByteArray()?

Trả lời

10

Có. Bạn nên định nghĩa BigInteger là BigInteger.toByteArray().

tôi đoán là BigDecimal sẽ là:


message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

khi BigInteger có thể được định nghĩa là


message BInteger { 
    required bytes value = 1; 
} 

Các mã để xử lý BigInteger sẽ là:


    BInteger write(BigInteger val) { 
    BInteger.Builder builder = BInteger.newBuilder(); 
    ByteString bytes = ByteString.copyFrom(val.toByteArray()); 
    builder.setValue(bytes); 
    return builder.build(); 
    } 

    BigInteger read(BInteger message) { 
    ByteString bytes = message.getValue(); 
    return new BigInteger(bytes.toByteArray()); 
    } 
+2

Bạn sẽ chuyển đổi BigDecimal thành BigInteger và tỷ lệ như thế nào? Và quay lại ? – stikkos

+1

Lúc đầu tôi lo ngại rằng cách tiếp cận này của việc sử dụng 'toByteArray' có thể không được di chuyển (không thể được deserialized có ý nghĩa từ các ngôn ngữ khác ngoài Java - thường là một trong những lý do chính để sử dụng protobuf ở nơi đầu tiên). Tuy nhiên, đặc tả cho ['BigInteger.toByteArray'] (http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#toByteArray()) khá cụ thể và dễ sử dụng từ các ngôn ngữ khác (ví dụ [.net BigInteger] (http://msdn.microsoft.com/en-us/library/dd268207 (v = vs.110) .aspx), mặc dù bạn phải cẩn thận vì endianness dường như là khác nhau). – bacar

1

Tại sao bạn muốn thay đổi nó? Chỉ vì bạn có thể hoặc có một nhu cầu thực sự (giống như một phiên lược tả xác nhận, việc tuần tự hóa/deserialization mất phần lớn thời gian).

Tôi sẽ sử dụng một chuỗi, chỉ vì nó được xây dựng trong :)

Cách tiếp cận mảng byte đề xuất (What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers) có vẻ tốt với tôi, nếu chuỗi đại diện có vẻ là một vấn đề.

+2

Tôi cho rằng đó là vấn đề tối ưu hóa mạng thay vì tối ưu hóa hiệu suất. Chuỗi yêu cầu nhiều bộ nhớ. Ví dụ: Integer.MAX_VALUE (2147483647) yêu cầu theo thứ tự 24 byte dưới dạng chuỗi nhưng chỉ có 8 byte làm mảng byte. – notnoop

Các vấn đề liên quan