Qual è l'approccio migliore per serializzare BigDecimal / BigInteger su ProtocolBuffer
-
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 <=>?
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.