BigDecimal/BigInteger를 프로토콜 버퍼로 직렬화하기위한 가장 좋은 방법은 무엇입니까?
-
20-08-2019 - |
문제
사용자 정의 직렬화 메커니즘을 프로토콜 버퍼로 마이그레이션하기 시작했습니다. 특히 정기적으로 사용될 데이터 유형 중 하나는 BigDecimal
.
프로토콜 버퍼 내에서 이것을 직렬화하는 좋은 방법을 아는 사람이 있습니까? 현재 직렬화 루틴이 사용됩니다 BigDecimal.toPlainString()
직렬화를 위해 new BigDecimal(String)
사막화를 위해 - 나는 더 나은 방법이 있다고 가정합니다.
제 생각에는 a를 정의하는 것입니다 BigDecimal
처럼:
message BDecimal {
required int32 scale = 1;
required BInteger int_val = 2;
}
그러나 나는 어떻게 정의 해야할지 잘 모르겠습니다 BigInteger
- 아마도 그것을 사용합니다 toByteArray()
방법?
해결책
예. biginteger를 biginteger.tobytearray ()로 정의해야합니다.
내 생각에 큰도는 다음과 같습니다.
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());
}
다른 팁
왜 그것을 바꾸고 싶습니까? 당신이 실제 요구가있을 수 있거나 실제 요구가 있기 때문에 (프로파일 링 세션을 확인하는 것처럼, 직렬화/사막화는 대부분의 시간이 걸립니다).
나는 그것이 내장되어 있기 때문에 문자열을 사용합니다. :)
제안 된 바이트 어레이 접근법 (BigDecimal/BigInteger를 프로토콜 버퍼로 직렬화하기위한 가장 좋은 방법은 무엇입니까?) 문자열 표현이 문제가된다면 나에게 괜찮은 것 같습니다.
제휴하지 않습니다 StackOverflow