Qual è l'approccio migliore per serializzare BigDecimal / BigInteger su ProtocolBuffer

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

  •  20-08-2019
  •  | 
  •  

Domanda

Sto iniziando a migrare un meccanismo di serializzazione personalizzato nei buffer di protocollo. Un tipo di dati che verrà utilizzato in modo particolarmente regolare è BigDecimal.

Qualcuno conosce un buon modo di serializzare questo all'interno di Protocol Buffers? La nostra attuale routine di serializzazione utilizza BigDecimal.toPlainString() per la serializzazione e new BigDecimal(String) per la deserializzazione: suppongo che ci sia un modo migliore.

La mia ipotesi è di definire un BigInteger come:

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

Ma non sono troppo sicuro di come definire toByteArray() - forse usando il suo metodo <=>?

È stato utile?

Soluzione

Sì. È necessario definire BigInteger come BigInteger.toByteArray ().

La mia ipotesi è che BigDecimal sarebbe:


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

mentre BigInteger può essere definito come


message BInteger {
  required bytes value = 1;
}

Il codice per gestire BigInteger sarebbe:


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

Altri suggerimenti

Perché vuoi cambiarlo? Solo perché puoi o c'è una reale necessità (come una sessione di profilazione che conferma, che la serializzazione / deserializzazione richiede la maggior parte del tempo).

Vorrei usare una stringa, solo perché è integrata :)

L'approccio di array di byte proposto ( Qual è l'approccio migliore per serializzare BigDecimal / BigInteger su ProtocolBuffers ) mi sembra perfetto, se la rappresentazione di stringhe sembra essere un problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top