2009-06-26 2 views
15

Я начинаю переносить собственный механизм сериализации в буферы протокола. Один тип данных, который будет использоваться особенно регулярно, - BigDecimal.Каков наилучший подход для сериализации BigDecimal/BigInteger к ProtocolBuffers

Кто-нибудь знает о хорошем способе сериализации этого в буферах протокола? Наша текущая процедура сериализации использует 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

+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

1

Почему ты хотите изменить его? Просто потому, что вы можете или есть реальная потребность (например, подтверждение профилирования, эта сериализация/десериализация занимает большую часть времени).

Я хотел бы использовать строку, только потому, что он построен в :)

Предложенный подход байтовый массив (What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers), кажется, хорошо для меня, если строковое представление, как представляется, является проблемой.

+2

Я предполагаю, что это проблема оптимизации сети, а не оптимизация производительности. Строка требует большой памяти. Например, Integer.MAX_VALUE (2147483647) требует порядка 24 байтов в виде строки, но только 8 байтов в качестве массива байтов. – notnoop

 Смежные вопросы

  • Нет связанных вопросов^_^