¿Cuál es el mejor enfoque para serializar BigDecimal / BigInteger a ProtocolBuffers?

StackOverflow https://stackoverflow.com/questions/1051732

  •  20-08-2019
  •  | 
  •  

Pregunta

Estoy empezando a migrar un mecanismo de serialización personalizado a Protocol Buffers. Un tipo de datos que se utilizará de manera particularmente regular es BigDecimal.

¿Alguien sabe de una buena manera de serializar esto dentro de Protocol Buffers? Nuestra rutina de serialización actual utiliza BigDecimal.toPlainString() para la serialización y new BigDecimal(String) para la deserialización. Supongo que hay una mejor manera.

Mi conjetura es definir un BigInteger como:

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

Pero no estoy muy seguro de cómo definir toByteArray() - ¿quizás usando su método <=>?

¿Fue útil?

Solución

Sí Debe definir BigInteger como BigInteger.toByteArray ().

Creo que BigDecimal sería:


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

mientras BigInteger puede definirse como


message BInteger {
  required bytes value = 1;
}

El código para manejar BigInteger sería:


  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());
  }

Otros consejos

¿Por qué quieres cambiarlo? Solo porque puede o existe una necesidad real (como una sesión de creación de perfiles que confirma que la serialización / deserialización lleva la mayor parte del tiempo).

Usaría una cadena, solo porque está integrada :)

El enfoque de matriz de bytes propuesto ( ¿Cuál es el mejor enfoque para serializar BigDecimal / BigInteger to ProtocolBuffers ) me parece bien, si la representación de cadenas parece ser un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top