2009-06-26 30 views
15

için serileştirmek için en iyi yaklaşım nedir? Özel bir seri hale getirme mekanizmasını Protokol Tamponlarına geçirmeye başlıyorum. Özellikle düzenli olarak kullanılacak bir veri türü BigDecimal'dir.BigDecimal/BigInteger'i ProtokolBuffers

Bunu Protokol Tamponları içinde iyi bir şekilde serileştirmenin iyi bir yolu var mı? Geçerli serileştirme rutinimiz serileştirme için BigDecimal.toPlainString() ve seri hale getirme için yeni BigDecimal (String) kullanır - daha iyi bir yol olduğunu varsayardım.

Benim tahminim gibi bir BigDecimal tanımlamaktır:

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

Ama BigInteger nasıl tanımlanacağı çok emin değilim - belki de toByteArray() yöntemini kullanarak?

cevap

10

Evet. BigInteger'i BigInteger.toByteArray() olarak tanımlamalısınız.

Benim tahminim BigDecimal olacağıdır: BigInteger


message BInteger { 
    required bytes value = 1; 
} 

işlemek için kod olarak tanımlanabilir ise


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

BigInteger olacaktır:


    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'i BigInteger ve ölçeğe nasıl dönüştürürsünüz? Ve geri mi? – stikkos

+1

İlk olarak, "toByteArray" işlevinin bu yaklaşımının taşınabilir olmadığı (Java dışındaki dillerden anlamlı şekilde serpiştirilemediği - genellikle de protobufun ilk etapta kullanılmasının temel nedenlerinden biri) olacağı konusunda endişeliydim. Ancak, ['BigInteger.toByteArray'] (http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#toByteArray()) için belirtim oldukça spesifik ve kolayca kullanılabilir diğer diller (örneğin, [.net BigInteger] (http://msdn.microsoft.com/en-us/library/dd268207 (v = vs.110) .aspx), çünkü endianness gibi dikkatli olmalısınız. farklı). – bacar

1

Neden öyle mi değiştirmek ister misin? Sadece gerçek bir gereksiniminiz olabileceği ya da mevcut olduğu için (çoğu zaman seri hale getirme/serileştirme işleminin onaylandığı bir profil oturumuna benzer). o :)

dize gösterimi bir sorun gibi görünüyor, eğer önerilen bayt dizisi yaklaşımı (What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers), iyi gibi geliyor bana inşa sırf

Ben bir dize kullanırsınız.

+2

Performans optimizasyonundan ziyade bir ağ optimizasyon problemi olduğunu varsayalım. Dize çok fazla bellek gerektirir. Örneğin, Integer.MAX_VALUE (2147483647), bir dizge olarak 24 bayt, ancak bayt dizisi olarak yalnızca 8 bayt sırasını gerektirir. – notnoop