2009-06-26 91 views
15

我開始將自定義序列化機制遷移到Protocol Buffers。一種特別經常使用的數據類型是BigDecimal。什麼是將BigDecimal/BigInteger序列化爲ProtocolBuffers的最佳方法

有誰知道在Protocol Buffers中序列化這個好方法嗎?我們當前的序列化例程使用BigDecimal.toPlainString()進行序列化,並使用新的BigDecimal(String)進行反序列化 - 我假設有更好的方法。

我的猜測是定義一個BigDecimal爲:

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

但我也不太清楚如何定義的BigInteger - 也許使用它的toByteArray()方法?

回答

10

是的。您應該將BigInteger定義爲BigInteger.toByteArray()。

我的猜測是,BigDecimal的將是:


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

而BigInteger的可以定義爲


message BInteger { 
    required bytes value = 1; 
} 

處理代碼的BigInteger是:


    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

如何將BigDecimal轉換爲BigInteger並進行縮放?然後回來 ? – stikkos 2012-11-18 16:18:40

+1

我首先擔心的是,這種使用`toByteArray`的方法可能不是可移植的(不能從Java以外的語言進行有意義的反序列化 - 這通常是首先使用protobuf的主要原因之一)。但是,[`BigInteger.toByteArray`](http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#toByteArray())的規範是非常具體且易於使用的其他語言(例如[.net BigInteger](http://msdn.microsoft.com/en-us/library/dd268207(v = vs.110).aspx)),但您必須小心,因爲字節序似乎是不同)。 – bacar 2014-03-11 12:14:49

相關問題